وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

«from_logits=True» در توابع از دست دادن Keras/TensorFlow چیست؟

0 9
زمان لازم برای مطالعه: 3 دقیقه


چارچوب‌های یادگیری عمیق مانند Keras موانع ورود توده‌ها را کاهش می‌دهند و توسعه مدل‌های DL را برای افراد بی‌تجربه دموکراتیک می‌کنند که می‌توانند به آن اعتماد کنند. روی پیش‌فرض‌های معقول و APIهای ساده‌شده برای تحمل بار سنگین سنگین‌کردن و تولید نتایج مناسب.

هنگام استفاده از توابع از دست دادن Keras برای طبقه بندی، یک سردرگمی رایج بین تمرین کنندگان جدیدتر یادگیری عمیق ایجاد می شود، مانند CategoricalCrossentropy و SparseCategoricalCrossentropy:

loss = keras.losses.SparseCategoricalCrossentropy(from_logits=True)

loss = keras.losses.SparseCategoricalCrossentropy(from_logits=False)

چه می کند from_logits پرچم اشاره به؟

پاسخ نسبتاً ساده است، اما نیاز به نگاهی به خروجی شبکه ای دارد که می خواهیم با استفاده از تابع ضرر درجه بندی کنیم.

Logits و SoftMax Probabilities

بطور خلاصه:

احتمالات عادی می شوند – یعنی محدوده ای بین آنها وجود دارد (0..1). لاجیت ها عادی نیستند و می توانند محدوده ای بین آنها داشته باشند (-inf...+inf).

بسته به روی لایه خروجی شبکه شما:

output = keras.layers.Dense(n, activation='softmax')(x)

output = keras.layers.Dense(n)(x)

خروجی از Dense لایه خواهد یا برگشت:

  • احتمالات: خروجی از طریق یک تابع SoftMax ارسال می شود که خروجی را به مجموعه ای از احتمالات عادی تبدیل می کند. n، که همه جمع می شوند 1.
  • logits: n فعال سازی ها

این تصور اشتباه احتمالاً از نحو کوتاهی ناشی می شود که به شما امکان می دهد یک فعال سازی را به یک لایه اضافه کنید. ظاهرا به عنوان یک لایه، حتی اگر فقط مختصر باشد:

output = keras.layers.Dense(n, activation='softmax')(x)

dense = keras.layers.Dense(n)(x)
output = keras.layers.Activation('softmax')(dense)

تابع ضرر شما باید در مورد اینکه آیا باید انتظار توزیع نرمال شده (خروجی عبور از یک تابع SoftMax) را داشته باشد یا logit ها را داشته باشد. از این رو from_logits پرچم!

وقتی باید from_logits=درست است?

اگر لایه خروجی شما دارای یک 'softmax' فعال سازی، from_logits باید باشد False. اگر لایه خروجی شما a ندارد 'softmax' فعال سازی، from_logits باید باشد True.

اگر شبکه شما احتمالات خروجی را عادی می کند، تابع ضرر شما باید تنظیم شود from_logits به False، زیرا لاجیت را نمی پذیرد. این نیز مقدار پیش‌فرض تمام کلاس‌های ضرری است که پرچم را می‌پذیرند، زیرا اکثر افراد یک علامت را اضافه می‌کنند activation='softmax' به لایه های خروجی آنها:

model = keras.Sequential((
    keras.layers.Input(shape=(10, 1)),
    
    keras.layers.Dense(10, activation='softmax') 
))

input_data = tf.random.uniform(shape=(1, 1))
output = model(input_data)
print(output)

این نتیجه در:

tf.Tensor(
(((0.12467965 0.10423233 0.10054766 0.09162105 0.09144577 0.07093797
   0.12523937 0.11292477 0.06583504 0.11253635))), shape=(1, 1, 10), dtype=float32)

از آنجایی که این شبکه منجر به توزیع نرمال می شود – هنگام مقایسه خروجی ها با خروجی های هدف، و درجه بندی آنها از طریق یک تابع ضرر طبقه بندی (برای کار مناسب) – شما باید تنظیم کنید from_logits به False، یا اجازه دهید مقدار پیش فرض باقی بماند.

از طرف دیگر، اگر شبکه شما SoftMax را اعمال نمی کند روی خروجی:

model = keras.Sequential((
    keras.layers.Input(shape=(10, 1)),
    
    keras.layers.Dense(10)
))

input_data = tf.random.uniform(shape=(1, 1))
output = model(input_data)
print(output)

این نتیجه در:

tf.Tensor(
(((-0.06081138  0.04154852  0.00153442  0.0705068  -0.01139916
    0.08506121  0.1211026  -0.10112958 -0.03410497  0.08653068))), shape=(1, 1, 10), dtype=float32)

شما باید تنظیم کنید from_logits به True برای اینکه عملکرد تلفات به درستی با خروجی ها رفتار کند.

زمان استفاده از SoftMax روی خروجی؟

اکثر پزشکان SoftMax را اعمال می کنند روی خروجی برای ارائه یک توزیع احتمال نرمال شده، زیرا در بسیاری از موارد این چیزی است که شما از یک شبکه برای آن استفاده خواهید کرد – به ویژه در مطالب آموزشی ساده شده. با این حال، در برخی موارد، شما نکن می خواهید تابع را در خروجی، به اعمال کنید process قبل از اعمال SoftMax یا تابع دیگری، آن را به روشی متفاوت انجام دهید.

یک مثال قابل توجه از مدل‌های NLP می‌آید، که در آن یک احتمال واقعی بیش از یک واژگان بزرگ می‌تواند در تانسور خروجی وجود داشته باشد. اعمال SoftMax روی همه آنها و حریصانه گرفتن argmax معمولاً نتایج خیلی خوبی ایجاد نمی کند.

با این حال، اگر logit ها را مشاهده کردید، Top-K را استخراج کنید (که در آن K می تواند هر عددی باشد اما معمولاً جایی بین (0...10)، و تنها پس از اعمال SoftMax به top-k نشانه های ممکن در واژگان توزیع را به طور قابل توجهی تغییر می دهند و معمولا نتایج واقعی تری تولید می کنند.

این به عنوان نمونه برداری Top-K شناخته می شود، و اگرچه استراتژی ایده آل نیست، معمولاً به طور قابل توجهی از نمونه برداری حریصانه بهتر عمل می کند.

نتیجه

در این راهنمای کوتاه، نگاهی به آن انداخته‌ایم from_logits استدلال برای کلاس های ضرر Keras، که اغلب سوالاتی را با تمرین کنندگان جدیدتر ایجاد می کند.

این سردرگمی احتمالاً از نحو کوتاهی ناشی می‌شود که اجازه می‌دهد لایه‌های فعال‌سازی اضافه شود. روی بالای لایه های دیگر، در تعریف خود یک لایه. ما در نهایت نگاهی به زمان تنظیم آرگومان انداختیم True یا False، و زمانی که یک خروجی باید به صورت logit باقی بماند یا از طریق یک تابع فعال سازی مانند SoftMax منتقل شود.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-04 00:14:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید