Lecture 03 · N-grams

المحاضرة 03 · نماذج N-grams

Interpolation and Backoff

الاستيفاء (Interpolation) والتراجع (Backoff)

Slides 67–73الشرائح 67–73 P2 SHOULDP2 مهم

Two ways to borrow strength from lower-order n-grams, the one-line difference between them, and why stupid backoff is not a probability.

طريقتان لاستعارة القوة من n-grams ذات الرتبة الأدنى، والفرق المختصر بينهما في سطر واحد، ولماذا لا يُعدّ stupid backoff احتمالاً.

The problem these solve

المشكلة التي يحلّانها

A trigram is specific but fragile. A unigram is robust but ignorant.

الـtrigram محدد ودقيق لكنه هشّ، والـunigram متين وقوي لكنه جاهل بالسياق.

Add-k smoothing only fixes zeros. It does nothing about a trigram whose count is 1. A count of 1 is a terrible estimate, but add-k treats it as real evidence.

لا يعالج add-k smoothing إلا الأصفار، ولا يفعل شيئاً تجاه trigram عدده 1. العدد 1 تقدير سيئ جداً، لكن add-k يتعامل معه كدليل حقيقي.

The slide puts it directly: when the trigram count is unreliable or zero, use bigram and unigram information. Combine orders to balance specificity against generalization.

تقولها الشريحة بصراحة: عندما يكون عدد الـtrigram غير موثوق أو صفراً، استخدم معلومات الـbigram والـunigram. امزج الرتب لتوازن بين التحديد الدقيق والتعميم.

The shape of the fixشكل الحل

Both methods bring in a lower order. They differ only in when. Interpolation brings it in always. Backoff brings it in only when the higher order has nothing to say.

كلتا الطريقتين تُدخل رتبة أدنى، والفرق بينهما في التوقيت فقط. الـinterpolation يُدخلها دائماً، والـbackoff يُدخلها فقط عندما لا يكون عند الرتبة الأعلى ما تقوله.

Linear interpolation

الاستيفاء الخطي (Linear interpolation)

Take a weighted average of all three orders. That is it.

خُذ متوسطاً مرجحاً للرتب الثلاث كلها. هذا كل شيء.

P̂(wn | wn−2 wn−1) = λ1·P(wn) + λ2·P(wn | wn−1) + λ3·P(wn | wn−2 wn−1)

One constraint, and the exam will test it:

قيد واحد، والاختبار سيسأل عنه:

λ1 + λ2 + λ3 = 1,   every λi ≥ 0

Why the constraint matters: a convex combination of probability distributions is a probability distribution. Sum the interpolated P̂ over all wn and you get λ1·1 + λ2·1 + λ3·1 = 1. Break the sum-to-one rule and the output stops being a distribution.

لماذا يهم هذا القيد: أي convex combination من probability distributions هو نفسه probability distribution. اجمع P̂ المدمجة على كل wn فتحصل على λ1·1 + λ2·1 + λ3·1 = 1. وإذا خرقت قاعدة "المجموع يساوي واحداً" توقف الناتج عن كونه توزيعاً احتمالياً.

Worked: one interpolated probabilityمثال محلول: احتمال واحد بالاستيفاء

Weights λ1 = 0.1 (unigram), λ2 = 0.3 (bigram), λ3 = 0.6 (trigram). They sum to 1.0, so we are legal.

الأوزان: λ1 = 0.1 للـunigram، وλ2 = 0.3 للـbigram، وλ3 = 0.6 للـtrigram. مجموعها 1.0، إذن نحن ملتزمون بالقيد.

P(w)              = 0.02      unigram
P(w | w₋₁)        = 0.10      bigram
P(w | w₋₂ w₋₁)    = 0.30      trigram

term 1:  λ₁ · P(w)            = 0.1 × 0.02 = 0.002
term 2:  λ₂ · P(w | w₋₁)      = 0.3 × 0.10 = 0.030
term 3:  λ₃ · P(w | w₋₂ w₋₁)  = 0.6 × 0.30 = 0.180
                                --------------------
P̂(w | w₋₂ w₋₁)                             = 0.212

Read the result. The pure trigram said 0.30. Interpolation returns 0.212, pulled down by the weaker lower orders. That drag is the price of insurance, and it is paid even when the trigram was perfectly well attested.

اقرأ النتيجة. الـtrigram الصافي أعطى 0.30، أما الـinterpolation فأعاد 0.212، مسحوباً إلى الأسفل بسبب الرتب الأدنى الأضعف. هذا السحب هو ثمن التأمين، ويُدفع حتى عندما كان الـtrigram موثقاً بالبيانات تماماً.

Context-dependent interpolation

الاستيفاء المعتمد على السياق

Fixed lambdas are blunt. The slide's refinement: let λ depend on the context.

الـlambdas الثابتة أداة غير دقيقة. والتحسين الذي تقدمه الشريحة: اجعل λ تعتمد على السياق.

P̂(wn | wn−2 wn−1) = λ1(wn−2:n−1)·P(wn) + λ2(wn−2:n−1)·P(wn | wn−1) + λ3(wn−2:n−1)·P(wn | wn−2 wn−1)

The lambdas are now a function of the history, not global constants. The rule the slide states: if counts are strong for a context, trust the higher-order n-gram more.

صارت الـlambdas دالة في الـhistory وليست ثوابت عامة. والقاعدة التي تنص عليها الشريحة: إذا كانت الأعداد قوية لسياق معين، فثِق أكثر بالـn-gram ذي الرتبة الأعلى.

History seen 50,000 times

سياق (history) ظهر 50,000 مرة

The trigram estimate is backed by real data. Push λ3 high.

تقدير الـtrigram مدعوم ببيانات حقيقية، فارفع λ3 عالياً.

λ₁ small λ₂ mid λ₃ large

History seen 2 times

سياق (history) ظهر مرتين

The trigram estimate is noise. Shift weight down to the orders that have data.

تقدير الـtrigram هنا مجرد ضجيج، فانقل الوزن إلى الرتب التي تملك بيانات فعلية.

λ₁ large λ₂ mid λ₃ small

Note the constraint still holds per history: for each context, that context's lambdas must sum to 1.

لاحظ أن القيد ما زال سارياً لكل history على حدة: لكل سياق، يجب أن يكون مجموع lambdas ذلك السياق مساوياً 1.

Where the lambdas come from

من أين تأتي قيم lambda

Interpolation weights and smoothing constants are hyperparameters. You do not read them off the training counts. You search for them.

أوزان الـinterpolation وثوابت الـsmoothing هي hyperparameters. أنت لا تقرأها من أعداد الـtraining، بل تبحث عنها بالتجربة.

  1. Split the corpus three ways: training, held-out (dev), test.

    اقسم الـcorpus إلى ثلاثة أقسام: training وheld-out (dev) وtest.

  2. Estimate all the n-gram probabilities P(w), P(w|w−1), P(w|w−2w−1) on the training set only.

    قدّر كل احتمالات الـn-gram، أي P(w) وP(w|w−1) وP(w|w−2w−1)، من مجموعة الـtraining وحدها.

  3. Freeze those probabilities. Now sweep candidate λ values.

    جمّد تلك الاحتمالات، ثم امسح قيم λ المرشحة واحدة بعد أخرى.

  4. For each candidate, score the held-out set: maximize its likelihood, equivalently minimize its perplexity.

    لكل قيمة مرشحة، قيّمها على مجموعة الـheld-out: عظّم الـlikelihood الخاصة بها، وهذا نفسه يعني تصغير الـperplexity الخاصة بها.

  5. Keep the λ set that wins on held-out. Report its number once, on the untouched test set.

    احتفظ بمجموعة λ الفائزة على الـheld-out، ثم أعلن رقمها مرة واحدة فقط على مجموعة الـtest التي لم تُلمَس.

Trap: tuning on the wrong splitفخ: الضبط على التقسيم الخاطئ للبيانات

Never tune lambdas on the training set. The training set is exactly where the trigram model is strongest, because the trigram counts were built from it. Optimizing held-out likelihood on train drives λ3 → 1 and λ1 = λ2 = 0. You get the unsmoothed trigram model back, which is the thing you were trying to fix.

لا تضبط الـlambdas أبداً على مجموعة الـtraining. مجموعة الـtraining هي بالضبط المكان الذي يكون فيه نموذج الـtrigram أقوى ما يكون، لأن أعداد الـtrigram بُنيت منها أصلاً. تعظيم الـlikelihood على الـtrain يدفع λ3 → 1 وλ1 = λ2 = 0، فتعود إليك نسخة الـtrigram غير المُمهّدة، وهي بذاتها الشيء الذي كنت تحاول إصلاحه.

Never tune on the test set either. That leaks the test set into the model and your reported perplexity becomes meaningless.

ولا تضبطها على مجموعة الـtest كذلك. هذا يُسرّب الـtest set إلى النموذج، فتصبح الـperplexity التي تُعلنها بلا معنى.

Backoff: the other option

التراجع (Backoff): الخيار الآخر

Backoff does not average. It picks one order and commits.

الـbackoff لا يأخذ متوسطاً أبداً، بل يختار رتبة واحدة ويلتزم بها.

Interpolation

الاستيفاء (Interpolation)

  • Always mixes n-gram orders.

    يمزج رتب الـn-gram دائماً.

  • Smoother distribution.

    ينتج توزيعاً أكثر نعومة.

  • Every prediction touches every order.

    كل تنبؤ يلمس كل الرتب.

Backoff

التراجع (Backoff)

  • Uses the highest order if it was seen.

    يستخدم أعلى رتبة إذا كانت قد ظهرت في البيانات.

  • Otherwise backs off to the lower order.

    وإلا فإنه يتراجع إلى الرتبة الأدنى.

  • Each prediction uses exactly one order.

    كل تنبؤ يستخدم رتبة واحدة بالضبط.

The comparison the exam wants

المقارنة التي يريدها الامتحان

Interpolationالاستيفاء (Interpolation)Backoffالتراجع (Backoff)
When lower orders are usedمتى تُستخدم الرتب الأدنى Always. Mixes all orders on every prediction.دائماً. يمزج كل الرتب في كل تنبؤ. Only on failure. Uses the highest order with a nonzero count.عند الفشل فقط. يستخدم أعلى رتبة لها عدّ غير صفري.
A trigram with count 40Trigram عدّه 40 Still blends in the bigram and the unigram.ما زال يمزج معه الـ bigram والـ unigram. Uses the trigram alone. Lower orders are never consulted.يستخدم الـ trigram وحده، ولا يرجع إلى الرتب الأدنى أبداً.
A trigram with count 0Trigram عدّه 0 λ3 · 0 drops out, so the bigram and unigram terms carry the estimate.الحد λ3 · 0 يسقط، فيحمل حدّا الـ bigram والـ unigram التقدير. Falls through to the bigram. If that is 0 too, falls through to the unigram.ينزل إلى الـ bigram، وإن كان عدّه 0 أيضاً ينزل إلى الـ unigram.
Orders used per predictionعدد الرتب المستخدمة في كل تنبؤ all 3الثلاث كلها exactly 1رتبة واحدة بالضبط
Resulting distributionالتوزيع الناتج Smoother. Convex mix of distributions.أنعم. مزيج محدّب (convex) من التوزيعات. Sharper. Needs discounted higher-order counts plus a normalizer to stay a true distribution (Katz backoff).أحدّ. يحتاج عدّات مخصومة (discounted) للرتب العليا مع معامل تطبيع ليبقى توزيعاً حقيقياً (Katz backoff).

يقارن الجدول بين الـinterpolation والـbackoff على خمسة محاور: متى تُستخدم الرتب الأدنى، وما يحدث عند trigram عدده 40، وما يحدث عند trigram عدده 0، وكم رتبة تُستخدم في التنبؤ الواحد، وشكل التوزيع الناتج. انظر إلى الصفين الأوسطين تحديداً فهما موضع الفرق كله: عند العدد 40 يظل الـinterpolation يمزج الـbigram والـunigram لأنه لا يحتوي أي شرط، بينما يستخدم الـbackoff الـtrigram وحده ولا يستشير الرتب الأدنى إطلاقاً، وعند العدد 0 فقط ينزل الـbackoff درجة واحدة. ولاحظ أيضاً السطر الأخير: الـbackoff يحتاج أعداداً عليا مخفّضة بالـdiscount مع normalizer كي يبقى توزيعاً احتمالياً حقيقياً، وهذا هو Katz backoff.

INTERPOLATION P(w | w₋₂ w₋₁) P(w | w₋₁) P(w) λ₃ λ₂ λ₁ P̂(w | w₋₂ w₋₁) all three, every time No branch. No condition. Three live arrows, always. BACKOFF C(trigram) > 0 ? C(bigram) > 0 ? unigram (floor) yes use trigram yes use bigram always stops here no, back off no, back off One order wins. The others are never touched.
Interpolation has no decision node. Backoff is nothing but decision nodes, and a zero count is the only thing that moves you down a level.
الاستيفاء لا توجد فيه عقدة قرار، أما التراجع فليس إلا عقد قرار، والعدّ الصفري هو الشيء الوحيد الذي ينزلك مستوى.

Stupid backoff

التراجع الغبي (Stupid backoff)

Slide 72 walks the intuition in words. quietly on the was never seen, so condition on less context and try on the. If on the was never seen, try the. If the was never seen, drop to the unigram.

تشرح الشريحة 72 الحدس بالكلمات: عبارة quietly on the لم تظهر أبداً، إذن اشترط على سياق أقل وجرّب on the. وإذا لم تظهر on the أبداً، جرّب the. وإذا لم تظهر the أبداً، انزل إلى الـunigram.

P(wi | quietly on the)   ≈   P(wi | on the)   ≈   P(wi | the)   ≈   P(wi)

Slide 73 gives Brants et al.'s actual recursion. Note the name: it returns a score S, not a probability P.

تعطي الشريحة 73 الـrecursion الفعلية كما وردت عند Brants et al.. وانتبه للاسم: الدالة تُعيد score يُرمز له بـS، ولا تُعيد احتمالاً P.

S(wi | wi−n+1:i−1) =count(wi−n+1:i)count(wi−n+1:i−1)   if count > 0λ · S(wi | wi−n+2:i−1)   otherwise

Three things to notice.

ثلاثة أمور تستحق الانتباه.

Worked: two levels of stupid backoffمثال محلول: مستويان من stupid backoff

Target word gate, history quietly on the, λ = 0.4. Suppose the counts are:

الكلمة الهدف gate، والسياق quietly on the، وλ = 0.4. لنفترض أن الأعداد كالتالي:

count(quietly on the gate) = 0      4-gram missing
count(on the gate)         = 0      trigram missing
count(the gate)            = 12     bigram found
count(the)                 = 24000

level 1:  count = 0  ->  multiply by λ = 0.4, drop one word
level 2:  count = 0  ->  multiply by λ = 0.4, drop one word
level 3:  count = 12 >  0  ->  stop, use the MLE

MLE at level 3   = 12 / 24000          = 0.0005
penalty applied  = 0.4 × 0.4           = 0.16
S(gate | quietly on the) = 0.16 × 0.0005 = 0.00008

Each backoff step costs a flat factor of 0.4. Two steps down cost 0.16 of the score. Nothing here was renormalized, and that is the whole point.

كل خطوة backoff تكلّف معاملاً ثابتاً قدره 0.4، وخطوتان للأسفل تكلّفان 0.16 من الدرجة. ولم يُعَد تطبيع أي شيء هنا، وهذه هي النقطة كلها.

Trap: stupid backoff is not a probability distributionفخ: stupid backoff ليس توزيعاً احتمالياً

The slide says it outright. Stupid backoff is not a true probability distribution. Σw S(w | history) does not equal 1.

تقولها الشريحة صريحة: الـstupid backoff ليس probability distribution حقيقياً. المجموع Σw S(w | history) لا يساوي 1.

Why it fails. The nonzero branch hands back raw MLE counts that already sum to 1 over the words that were seen in that context. Then the zero branch bolts on extra λ-weighted mass for every unseen word, and nothing is ever subtracted or renormalized to pay for it. Mass is added without being taken from anywhere, so the total overshoots 1.

لماذا يفشل: الفرع غير الصفري يُعيد أعداد MLE الخام التي مجموعها 1 أصلاً على الكلمات التي ظهرت فعلاً في ذلك السياق. ثم يأتي الفرع الصفري فيُلحق كتلة إضافية موزونة بـλ لكل كلمة لم تظهر، ولا يُطرح شيء ولا يُعاد التطبيع أبداً لتغطية هذه الإضافة. تُضاف الكتلة دون أن تُؤخذ من أي مكان، فيتجاوز المجموع الواحد.

Hence the name. It is called "stupid" because it skips the normalization that Katz backoff does properly with discounting plus a per-context α. Brants et al. (2007) showed that at web scale, with enough data, the cheap version matches the expensive one and is far faster to build. You therefore cannot compute a perplexity from it, because perplexity assumes a normalized distribution.

من هنا جاء الاسم. يُسمّى "غبياً" لأنه يتخطى الـnormalization التي يقوم بها Katz backoff على الوجه الصحيح عبر الـdiscounting مع α خاصة بكل سياق. وقد أظهر Brants et al. (2007) أنه على نطاق الويب، ومع بيانات كافية، تُجاري النسخةُ الرخيصة النسخةَ المكلفة وتُبنى أسرع منها بكثير. ولهذا السبب لا يمكنك حساب perplexity منه، لأن الـperplexity تفترض توزيعاً مُطبّعاً.

Memory hooksمفاتيح للحفظ

Check yourself

اختبر نفسك

A trigram appears 40 times in training, so its MLE estimate is solid. What happens under linear interpolation versus backoff?

ظهر trigram 40 مرة في الـtraining، إذن تقديره بالـMLE متين. فما الذي يحدث تحت الـlinear interpolation مقابل الـbackoff؟

C. Interpolation has no condition in it, so all three terms are always present no matter how large the trigram count is. Backoff checks "is the count nonzero?", finds yes, and stops. A and B are the classic confusions: A forgets that interpolation never branches, and B describes interpolation twice. D has the two methods swapped, which is the most common wrong answer on this topic.

C. لا يوجد في الـinterpolation أي شرط، إذن الحدود الثلاثة كلها حاضرة دائماً مهما كان عدد الـtrigram كبيراً. أما الـbackoff فيسأل "هل العدد غير صفري؟"، فيجد الجواب نعم، فيتوقف عند هذا الحد. والخياران A وB هما الخلطان الكلاسيكيان: A ينسى أن الـinterpolation لا يتفرّع أبداً، وB يصف الـinterpolation مرتين. والخيار D يعكس الطريقتين، وهو أشهر إجابة خاطئة في هذا الموضوع.

In P̂(wn|wn−2wn−1) = λ1P(wn) + λ2P(wn|wn−1) + λ3P(wn|wn−2wn−1), what must be true of the lambdas?

في P̂(wn|wn−2wn−1) = λ1P(wn) + λ2P(wn|wn−1) + λ3P(wn|wn−2wn−1)، ما الذي يجب أن يتحقق في الـlambdas؟

B. The sum-to-one constraint is what makes P̂ a probability distribution: summing over all wn gives λ1+λ2+λ3 = 1. A is the trap. Keeping each λ under 1 is not enough, since λ = (0.5, 0.5, 0.5) would make the total probability 1.5. C is a common guess but false, since a weak history can legitimately get λ1 > λ3. D invents a rule that does not exist.

B. قيد "المجموع يساوي واحداً" هو ما يجعل P̂ توزيعاً احتمالياً: الجمع على كل wn يعطي λ1+λ2+λ3 = 1. والخيار A هو الفخ، فكون كل λ أقل من 1 ليس كافياً، إذ إن λ = (0.5, 0.5, 0.5) تجعل الاحتمال الكلي 1.5. والخيار C تخمين شائع لكنه خاطئ، لأن history ضعيفاً يمكن أن يأخذ بشكل مشروع λ1 > λ3. والخيار D يخترع قاعدة لا وجود لها.

Which data split do you use to choose the interpolation weights?

أي قسم من البيانات تستخدمه لاختيار أوزان الـinterpolation؟

D. Lambdas are hyperparameters, so they are set on a held-out corpus by maximizing held-out likelihood, equivalently minimizing held-out perplexity. A is the single most instructive wrong answer: on the training data the trigram model always looks best, so the optimizer drives λ3 to 1 and λ1 = λ2 = 0, returning the unsmoothed model you were trying to fix. B leaks the test set and voids your reported number. C is false, since there is no closed form, you search.

D. الـlambdas هي hyperparameters، إذن تُضبط على corpus من نوع held-out بتعظيم الـlikelihood عليه، وهو نفسه تصغير الـperplexity عليه. والخيار A هو أكثر الإجابات الخاطئة إفادة: على بيانات الـtraining يبدو نموذج الـtrigram الأفضل دائماً، فيدفع المُحسِّن λ3 إلى 1 وλ1 = λ2 = 0، فيعيد لك النموذج غير المُمهّد الذي كنت تحاول إصلاحه. والخيار B يُسرّب الـtest set ويُلغي قيمة الرقم الذي تُعلنه. والخيار C خاطئ، فلا توجد صيغة مغلقة، بل تبحث بالتجربة.

Why is stupid backoff called "stupid"?

لماذا يُسمّى الـstupid backoff بـ"الغبي"؟

A. It skips discounting and renormalization, so mass is added for unseen events without being subtracted anywhere. The scores overshoot 1 and you cannot compute a perplexity from them. Brants et al. (2007) showed it works fine at web scale anyway. B is wrong: it uses the highest order with a nonzero count and only descends on a zero. C is wrong: it is far better than add-one at scale. D is wrong: λ is a single fixed constant, usually 0.4, which is exactly why it is cheap.

A. إنه يتخطى الـdiscounting وإعادة التطبيع، إذن تُضاف كتلة للأحداث غير المرئية دون أن تُطرح من أي مكان. فتتجاوز الدرجات الواحد، ولا يمكنك حساب perplexity منها. وقد أظهر Brants et al. (2007) أنه يعمل جيداً على نطاق الويب على أي حال. والخيار B خاطئ: فهو يستخدم أعلى رتبة لها عدد غير صفري، ولا ينزل إلا عند الصفر. والخيار C خاطئ: فهو أفضل بكثير من add-one على النطاق الكبير. والخيار D خاطئ: فـλ ثابت واحد مُحدد، عادة 0.4، وهذا بالضبط سبب رخصه.

λ = 0.4. count("quietly on the gate") = 0, count("on the gate") = 0, count("the gate") = 12, count("the") = 24000. What is S(gate | quietly on the)?

λ = 0.4، وcount("quietly on the gate") = 0، وcount("on the gate") = 0، وcount("the gate") = 12، وcount("the") = 24000. فما قيمة S(gate | quietly on the)؟

B. Two zero counts mean two backoff steps, each multiplying by 0.4, so the penalty is 0.4 × 0.4 = 0.16. The bigram MLE is 12/24000 = 0.0005. The score is 0.16 × 0.0005 = 0.00008. A forgets the penalty entirely and reports the raw MLE. C applies only one factor of 0.4 (0.4 × 0.0005 = 0.0002), which is the off-by-one-level error. D is the interpolation worked example from earlier on this page, included here because mixing up the two examples is easy under time pressure.

B. عددان صفريان يعنيان خطوتَي backoff، وكل خطوة تضرب في 0.4، إذن العقوبة 0.4 × 0.4 = 0.16. وMLE الـbigram هو 12/24000 = 0.0005. فتكون الدرجة 0.16 × 0.0005 = 0.00008. والخيار A ينسى العقوبة تماماً ويذكر الـMLE الخام. والخيار C يطبّق معامل 0.4 مرة واحدة فقط (0.4 × 0.0005 = 0.0002)، وهو خطأ النزول بمستوى واحد أقل من اللازم. والخيار D هو مثال الـinterpolation المحلول سابقاً في هذه الصفحة، ووُضع هنا لأن خلط المثالين سهل جداً تحت ضغط الوقت.

In context-dependent interpolation the weights are written λ(wn−2:n−1). What does that notation buy you?

في الـcontext-dependent interpolation تُكتب الأوزان على الصورة λ(wn−2:n−1). فماذا يمنحك هذا الترميز؟

C. The weights become a function of the history. A history seen 50,000 times gets a large λ3, while one seen twice shifts weight to the bigram and unigram, which is exactly the slide's rule that strong counts justify trusting the higher order. A is wrong: the constraint still holds, now per history. B describes fixed global lambdas, the thing context-dependence replaces. D is wrong: these are still hyperparameters tuned on held-out data, just more of them.

C. تصبح الأوزان دالة في الـhistory. فالـhistory الذي ظهر 50,000 مرة يحصل على λ3 كبيرة، أما الذي ظهر مرتين فينقل الوزن إلى الـbigram والـunigram، وهذا بالضبط ما تنص عليه الشريحة من أن الأعداد القوية تُبرر الثقة بالرتبة الأعلى. والخيار A خاطئ: القيد ما زال سارياً، لكن لكل history على حدة الآن. والخيار B يصف الـlambdas العامة الثابتة، وهي الشيء الذي جاء الاعتماد على السياق ليحل محله. والخيار D خاطئ: فهي ما زالت hyperparameters تُضبط على بيانات held-out، لكنها أكثر عدداً فقط.