লগইট, সফটম্যাক্স এবং সফটম্যাক্স_ক্রস_এন্ট্রপি_সহ_লগিট কী?


350

আমি এখানে টেনসরফ্লো এপিআই ডক্স দিয়ে যাচ্ছিলাম । টেনসরফ্লো ডকুমেন্টেশনে, তারা একটি কীওয়ার্ড বলে logits। এটা কি? এপিআই ডক্সে প্রচুর পদ্ধতিতে এটি লিখিত হয়

tf.nn.softmax(logits, name=None)

যদি যা লেখা হয় logitsকেবল সেগুলি হয় তবে Tensorsআলাদা নাম রাখার কারণ logits?

আরেকটি বিষয় হ'ল দুটি পদ্ধতি আছে যা আমি আলাদা করতে পারিনি। তারা ছিল

tf.nn.softmax(logits, name=None)
tf.nn.softmax_cross_entropy_with_logits(logits, labels, name=None)

তাদের মধ্যে পার্থক্য কি কি? দস্তাবেজগুলি আমার কাছে পরিষ্কার নয়। আমি জানি কি tf.nn.softmaxকরে। তবে অন্যটি নয়। একটি উদাহরণ সত্যই সহায়ক হবে।

উত্তর:


426

লগইটগুলি সহজভাবে বোঝায় যে ফাংশনটি পূর্ববর্তী স্তরগুলির অনাবৃত আউটপুটটিতে কাজ করে এবং ইউনিটগুলি বোঝার জন্য আপেক্ষিক স্কেল লিনিয়ার হয় is এর অর্থ, বিশেষত, ইনপুটগুলির যোগফল 1 টির সমান নাও হতে পারে, মানগুলি সম্ভাবনা নয় (আপনার 5 এর ইনপুট থাকতে পারে)।

tf.nn.softmaxএকটি ইনপুট টেনসারে সফটম্যাক্স ফাংশন প্রয়োগের ফলাফল তৈরি করে । সফটম্যাক্স ইনপুটগুলিকে "স্কুইশ" করে sum(input) = 1: এটি স্বাভাবিক করার একটি উপায়। একটি সফটম্যাক্সের আউটপুট আকারটি ইনপুট হিসাবে একই: এটি মানগুলি স্বাভাবিক করে। সফটম্যাক্সের ফলাফলগুলি সম্ভাব্যতা হিসাবে ব্যাখ্যা করা যেতে পারে।

a = tf.constant(np.array([[.1, .3, .5, .9]]))
print s.run(tf.nn.softmax(a))
[[ 0.16838508  0.205666    0.25120102  0.37474789]]

বিপরীতে, tf.nn.softmax_cross_entropy_with_logitsসফটম্যাক্স ফাংশন প্রয়োগের পরে ফলাফলের ক্রস এনট্রপি গণনা করে (তবে এটি আরও একসাথে আরও গাণিতিকভাবে সাবধানতার সাথে করে)। এটি এর ফলাফলের মতো:

sm = tf.nn.softmax(x)
ce = cross_entropy(sm)

ক্রস এনট্রপি একটি সারসংক্ষেপ মেট্রিক: এটি উপাদানগুলির মধ্যে জুড়ে। tf.nn.softmax_cross_entropy_with_logitsএকটি আকৃতির [2,5]টেন্সরের উপর আউটপুট আকারের হয় [2,1](প্রথম মাত্রাটি ব্যাচ হিসাবে বিবেচনা করা হয়)।

যদি আপনি ক্রস এনট্রপিকে হ্রাস করতে অপ্টিমাইজেশন করতে চান এবং আপনি আপনার শেষ স্তরটির পরে সফটম্যাক্স tf.nn.softmax_cross_entropy_with_logitsকরছেন তবে এটি নিজে করার পরিবর্তে আপনার ব্যবহার করা উচিত , কারণ এটি গাণিতিকভাবে সঠিকভাবে সংখ্যাগত অস্থির কোণার কেসগুলিকে আবরণ করে। অন্যথায়, আপনি এখানে এবং সেখানে সামান্য অ্যাপসিলন যুক্ত করে এটি হ্যাকিং শেষ করবেন।

২০১-0-০২-০7 সম্পাদিত: আপনার যদি একক শ্রেণির লেবেল থাকে, যেখানে কোনও অবজেক্ট কেবলমাত্র একটি শ্রেণীর অন্তর্গত হতে পারে, আপনি এখন এটি ব্যবহারের কথা বিবেচনা tf.nn.sparse_softmax_cross_entropy_with_logitsকরতে পারেন যাতে আপনার লেবেলগুলিকে ঘন এক-গরম অ্যারে রূপান্তর করতে না হয়। এই ফাংশনটি 0.6.0 প্রকাশের পরে যুক্ত করা হয়েছিল।


1
সফটম্যাক্স_ক্রস_এন্ট্রপি_ও_লগিট সম্পর্কে, আমি জানি না আমি এটি সঠিকভাবে ব্যবহার করি কিনা if ফলাফলটি আমার কোডটিতে স্থিতিশীল নয়। একই কোডটি দু'বার চলে, মোট নির্ভুলতা 0.6 থেকে 0.8 এ পরিবর্তিত হয়। cross_entropy = tf.nn.softmax_cross_entropy_with_logits(tf.nn.softmax(tf.add(tf.matmul(x,W),b)),y) cost=tf.reduce_mean(cross_entropy)। তবে আমি যখন অন্য কোনও উপায়ে ব্যবহার করি, pred=tf.nn.softmax(tf.add(tf.matmul(x,W),b)) cost =tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1))ফলাফল স্থিতিশীল এবং ভাল।
রিদা

15
আপনি আপনার প্রথম লাইনে ডাবল সফটম্যাক্সিং করছেন। সফটম্যাক্স_ক্রস_এন্ট্রপি_বিহীন_লগইটস টিফ.এনএন.সোফটম্যাক্সের আউটপুট নয়, আনসার্কড লগইটগুলির প্রত্যাশা করে। আপনি শুধু tf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W, b))আপনার ক্ষেত্রে চান ।
ডিগা

7
@dga আমার মনে হয় আপনি আপনার কোডে একটি টাইপো আছে, bপ্রয়োজন, বন্ধনী বাইরে হতেtf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W), b)
jrieke

1
"ইউনিটগুলি বোঝার জন্য যে আপেক্ষিক স্কেলটি লিনিয়ার তা কী করে"। আপনার প্রথম বাক্য অংশ মানে?
চার্লি পার্কার

5
উত্সাহিত-তবে আপনার উত্তরটি কিছুটা ভুল যখন আপনি বলেন যে "[টি] একটি সফটম্যাক্সের আউটপুট তার আকার হিসাবে ইনপুট হিসাবে একই - এটি মানগুলি স্বাভাবিক করে তোলে"। সফটম্যাক্স কেবল মানগুলি "স্কোয়াশ" করে না যাতে তাদের যোগফল 1 সমান হয় It এটি তাদের পুনরায় বিতরণও করে এবং সম্ভবত এটিই ব্যবহৃত হওয়ার মূল কারণ। দেখুন stackoverflow.com/questions/17187507/... , বিশেষ করে পাযত্র Czapla এর উত্তর।
পাওলো পেরোটা

282

সংক্ষিপ্ত সংস্করণ:

ধরুন আপনার দুটি টেনার y_hatরয়েছে , যেখানে প্রতিটি শ্রেণির জন্য গণনা করা স্কোর রয়েছে (উদাহরণস্বরূপ, y = W * x + b থেকে) এবং y_trueএতে এক-হট এনকোড হওয়া সত্য লেবেল রয়েছে।

y_hat  = ... # Predicted label, e.g. y = tf.matmul(X, W) + b
y_true = ... # True label, one-hot encoded

আপনি যদি স্কোরটিকেy_hat অস্বাভাবিক লগ সম্ভাব্যতা হিসাবে ব্যাখ্যা করেন তবে সেগুলি লগইট হয়

অতিরিক্তভাবে, মোট ক্রস-এনট্রপি লোকসান এই পদ্ধতিতে গণনা:

y_hat_softmax = tf.nn.softmax(y_hat)
total_loss = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_hat_softmax), [1]))

মূলত ফাংশনটির সাথে গণনা করা মোট ক্রস-এনট্রপি লোকসানের সমতুল্য softmax_cross_entropy_with_logits():

total_loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true))

দীর্ঘ সংস্করণ:

আপনার নিউরাল নেটওয়ার্কের আউটপুট স্তরে, আপনি সম্ভবত এমন একটি অ্যারে গণনা করবেন যা আপনার প্রতিটি প্রশিক্ষণের জন্য ক্লাস স্কোর রয়েছে, যেমন কোনও গণনা থেকে y_hat = W*x + b। একটি উদাহরণ হিসাবে পরিবেশন করতে, নীচে আমি y_hatএকটি 2 x 3 অ্যারে তৈরি করেছি , যেখানে সারিগুলি প্রশিক্ষণের উদাহরণগুলির সাথে সামঞ্জস্য করে এবং কলামগুলি ক্লাসগুলির সাথে মিলে যায়। সুতরাং এখানে 2 টি প্রশিক্ষণ উদাহরণ এবং 3 ক্লাস রয়েছে।

import tensorflow as tf
import numpy as np

sess = tf.Session()

# Create example y_hat.
y_hat = tf.convert_to_tensor(np.array([[0.5, 1.5, 0.1],[2.2, 1.3, 1.7]]))
sess.run(y_hat)
# array([[ 0.5,  1.5,  0.1],
#        [ 2.2,  1.3,  1.7]])

মনে রাখবেন মানগুলি স্বাভাবিক হয় না (উদাহরণস্বরূপ সারিগুলি 1 পর্যন্ত যোগ করে না)। এগুলি স্বাভাবিক করার জন্য, আমরা সফটম্যাক্স ফাংশনটি প্রয়োগ করতে পারি, যা ইনপুটটিকে অস্বাভাবিক লগ সম্ভাব্যতা (ওরফে লগইটস ) হিসাবে ব্যাখ্যা করে এবং লাইনারি সম্ভাব্যতাগুলিকে সাধিত করে তোলে

y_hat_softmax = tf.nn.softmax(y_hat)
sess.run(y_hat_softmax)
# array([[ 0.227863  ,  0.61939586,  0.15274114],
#        [ 0.49674623,  0.20196195,  0.30129182]])

সফটম্যাক্স আউটপুট কী বলছে তা পুরোপুরি বুঝতে গুরুত্বপূর্ণ। নীচে আমি একটি টেবিল দেখিয়েছি যা উপরের আউটপুটটিকে আরও স্পষ্টভাবে প্রতিনিধিত্ব করে। এটি দেখা যায়, উদাহরণস্বরূপ, প্রশিক্ষণের উদাহরণ 1 "ক্লাস 2" হওয়ার সম্ভাবনা 0.619। প্রতিটি প্রশিক্ষণের জন্য শ্রেণীর সম্ভাবনাগুলি স্বাভাবিক করা হয়, তাই প্রতিটি সারির যোগফল 1.0 হয়।

                      Pr(Class 1)  Pr(Class 2)  Pr(Class 3)
                    ,--------------------------------------
Training instance 1 | 0.227863   | 0.61939586 | 0.15274114
Training instance 2 | 0.49674623 | 0.20196195 | 0.30129182

সুতরাং এখন আমাদের প্রতিটি প্রশিক্ষণের উদাহরণের ক্লাসের সম্ভাবনা রয়েছে, যেখানে আমরা চূড়ান্ত শ্রেণিবিন্যাস তৈরি করতে প্রতিটি সারির আরগম্যাক্স () নিতে পারি। উপরের দিক থেকে, আমরা জেনারেশন করতে পারি যে প্রশিক্ষণ উদাহরণ 1 "ক্লাস 2" এর সাথে সম্পর্কিত এবং প্রশিক্ষণ উদাহরণ 2 "ক্লাস 1" এর অন্তর্গত।

এই শ্রেণিবিন্যাসগুলি কি সঠিক? আমাদের প্রশিক্ষণের সেট থেকে সত্য লেবেলের বিরুদ্ধে পরিমাপ করা দরকার। আপনার একটি এক-হট এনকোডেড y_trueঅ্যারে লাগবে , যেখানে আবার সারিগুলির প্রশিক্ষণের উদাহরণ এবং কলামগুলি ক্লাস। নীচে আমি একটি y_trueউষ্ণ অ্যারে তৈরি করেছি যেখানে প্রশিক্ষণের উদাহরণ 1 এর জন্য সত্য লেবেল "ক্লাস 2" এবং প্রশিক্ষণের উদাহরণ 2 এর জন্য সত্য লেবেল "ক্লাস 3"।

y_true = tf.convert_to_tensor(np.array([[0.0, 1.0, 0.0],[0.0, 0.0, 1.0]]))
sess.run(y_true)
# array([[ 0.,  1.,  0.],
#        [ 0.,  0.,  1.]])

সম্ভাবনা বন্টন সম্ভাব্যতা বিতরণ y_hat_softmaxকাছাকাছি হয় y_true? ত্রুটিটি পরিমাপ করতে আমরা ক্রস-এন্ট্রপি ক্ষতি ব্যবহার করতে পারি ।

ক্রস-এনট্রপি ক্ষতির জন্য সূত্র

আমরা ক্রস-এনট্রপি ক্ষয়টি সারিবদ্ধ ভিত্তিতে গণনা করতে পারি এবং ফলাফলগুলি দেখতে পারি। নীচে আমরা দেখতে পারি যে প্রশিক্ষণের উদাহরণ 1 টির ক্ষতি 0.479 রয়েছে, তবে প্রশিক্ষণের উদাহরণ 2 এর বেশি ক্ষতি হয়েছে 1.200। এই ফলাফলটি বোধগম্য হয় কারণ উপরোক্ত আমাদের উদাহরণে y_hat_softmaxদেখা গেছে যে প্রশিক্ষণের উদাহরণ 1 এর সর্বোচ্চ সম্ভাবনা ছিল "ক্লাস 2" এর জন্য, যা প্রশিক্ষণ উদাহরণ 1-এর সাথে মেলে y_true; তবে, প্রশিক্ষণের উদাহরণ 2 এর পূর্বাভাসটি "ক্লাস 1" এর জন্য সর্বোচ্চ সম্ভাবনা দেখিয়েছে, যা সত্য শ্রেণীর "ক্লাস 3" এর সাথে মেলে না।

loss_per_instance_1 = -tf.reduce_sum(y_true * tf.log(y_hat_softmax), reduction_indices=[1])
sess.run(loss_per_instance_1)
# array([ 0.4790107 ,  1.19967598])

আমরা সত্যিই যা চাই তা হ'ল সমস্ত প্রশিক্ষণের ক্ষেত্রে সম্পূর্ণ ক্ষতি। সুতরাং আমরা গণনা করতে পারি:

total_loss_1 = tf.reduce_mean(-tf.reduce_sum(y_true * tf.log(y_hat_softmax), reduction_indices=[1]))
sess.run(total_loss_1)
# 0.83934333897877944

সফটম্যাক্স_ক্রস_এন্ট্রপি_সহ_লগিটগুলি ()

tf.nn.softmax_cross_entropy_with_logits()নীচে দেখানো হিসাবে আমরা ফাংশনটি ব্যবহার করে মোট ক্রস এনট্রপি ক্ষতি গণনা করতে পারি ।

loss_per_instance_2 = tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true)
sess.run(loss_per_instance_2)
# array([ 0.4790107 ,  1.19967598])

total_loss_2 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_hat, y_true))
sess.run(total_loss_2)
# 0.83934333897877922

নোট করুন total_loss_1এবং total_loss_2খুব চূড়ান্ত অঙ্কের মধ্যে কিছু ছোট পার্থক্য সহ মূলত সমতুল্য ফলাফল উত্পাদন করুন। তবে আপনি দ্বিতীয় পদ্ধতিটিও ব্যবহার করতে পারেন: এটি কোডের একটি কম লাইন নেয় এবং কম সংখ্যক ত্রুটি জমে কারণ আপনার ভিতরে সফটম্যাক্সটি করা হয়ে থাকে softmax_cross_entropy_with_logits()


আমি উপরের সমস্ত নিশ্চিত। সাধারণ কোড: M = tf.random.uniform([100, 10], minval=-1.0, maxval=1.0); labels = tf.one_hot(tf.random.uniform([100], minval=0, maxval=10 , dtype='int32'), 10); tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=M) - tf.reduce_sum(-tf.nn.log_softmax(M)*tf.one_hot(labels, 10), -1)সর্বত্র শূন্যের কাছাকাছি ফিরে আসে
সামি এ হাইজা

51

tf.nn.softmaxএকটি সফটম্যাক্স লেয়ারের মাধ্যমে এগিয়ে প্রচারের গণনা করে। আপনি যখন মডেলটি যে সম্ভাবনাগুলি বেরিয়ে আসেন তার গণনা করার সময় আপনি এটি মডেলটির মূল্যায়নের সময় ব্যবহার করেন ।

tf.nn.softmax_cross_entropy_with_logitsএকটি সফটম্যাক্স স্তরের জন্য ব্যয় গণনা করে। এটি কেবল প্রশিক্ষণের সময় ব্যবহৃত হয় ।

লগইটগুলি হ'ল অস্বাভাবিক লগ সম্ভাব্যতাগুলি মডেল আউটপুট দেয় (তাদের উপর সফটম্যাক্স নরমালাইজেশন প্রয়োগের আগে মান আউটপুট)।


2
আমি এটা পাই. কেন tf.nn.softmax_cross_entropy_sans_normalization ফাংশনটি কল করবেন না?
অ্যারো

8
@ ইউরো কারণ ক্রস-এনট্রপি গণনার সময় এটি মানকে (অভ্যন্তরীণভাবে) স্বাভাবিক করে তোলে। বিষয়টি tf.nn.softmax_cross_entropy_with_logitsহ'ল মূল্যায়ন করা হ'ল মডেলটি সোনার লেবেলগুলি থেকে কতটা বিচ্যুত হয়, কোনও সাধারণীকৃত আউটপুট সরবরাহ না করে।
এরিক্রিফ

1
Tf.nn.sparse_softmax_cross_entropy_with_logits () ব্যবহারের ক্ষেত্রে একটি স্পারস সফটম্যাক্স লেয়ারের ব্যয় গণনা করে, এবং এইভাবে কেবলমাত্র নতুন ডেটার বিরুদ্ধে মডেল চালানোর সময় বিকল্পটি কী হবে তা প্রশিক্ষণের সময় ব্যবহার করা উচিত, এ থেকে সম্ভাব্যতা পাওয়া সম্ভব কিনা? এক.
সিরিয়ালদেব

2
@ সিরিয়ালডিভ, এর থেকে সম্ভাব্যতা পাওয়া সম্ভব নয় tf.nn.sparse_softmax_cross_entropy_with_logits। সম্ভাব্যতা পেতে ব্যবহার tf.nn.softmax
নন্দীশ

4

উপরের উত্তরের জিজ্ঞাসিত প্রশ্নের যথেষ্ট বিবরণ রয়েছে।

এতে যোগ করার সাথে সাথে টেনসরফ্লো অ্যাক্টিভেশন ফাংশন প্রয়োগের অপারেশনটিকে অনুকূলিত করেছে তারপরে ব্যয় ফাংশনগুলি অনুসরণ করে তার নিজস্ব অ্যাক্টিভেশন ব্যবহার করে ব্যয় গণনা করে। অতএব এটি ব্যবহার করা ভাল অনুশীলন: tf.nn.softmax_cross_entropy()ওভারtf.nn.softmax(); tf.nn.cross_entropy()

আপনি একটি সংস্থান নিবিড় মডেল মধ্যে তাদের মধ্যে বিশিষ্ট পার্থক্য খুঁজে পেতে পারেন।


1
উপরের উত্তরটি স্পষ্টভাবে প্রশ্নটি পড়ে নি .. তারা সবাই একই কথা বলে, যা জানা আছে, তবে নিজেই প্রশ্নের উত্তর দেয় না
Euler_Salter

@abish আপনার মানে কি, তার tf.nn.softmaxপরে tf.losses.softmax_cross_entropy?
অংকুরক্র

4

softmaxলগিটে যা যা যায় তা হ'ল জে হিন্টন কোর্স ভিডিওগুলিতে সারাক্ষণ পুনরাবৃত্তি করে।


1

টেনসরফ্লো ২.০ সামঞ্জস্যপূর্ণ উত্তর : লজিটস এবং সম্পর্কিত ফাংশনগুলির ব্যাখ্যা dgaএবং stackoverflowuser2010এর সম্পর্কে খুব বিস্তারিত।

সমস্ত ফাংশন, যখন ব্যবহৃত Tensorflow 1.xইচ্ছা কাজ জরিমানা, কিন্তু যদি আপনার কাছ থেকে আপনার কোড মাইগ্রেট 1.x (1.14, 1.15, etc)করতে 2.x (2.0, 2.1, etc..), যারা ফাংশন ব্যবহার করে ত্রুটি স্থাপিত।

অতএব, সমস্ত ক্রিয়াকলাপের জন্য ২.০ সামঞ্জস্যপূর্ণ কলগুলি নির্দিষ্ট করে, আমরা 1.x to 2.xসম্প্রদায়ের সুবিধার জন্য আমরা যদি স্থানান্তর করি তবে আমরা উপরে আলোচনা করেছি discussed

1.x এ কার্য :

  1. tf.nn.softmax
  2. tf.nn.softmax_cross_entropy_with_logits
  3. tf.nn.sparse_softmax_cross_entropy_with_logits

1.x থেকে 2.x এ স্থানান্তরিত হলে সম্মানজনক কার্যাদি :

  1. tf.compat.v2.nn.softmax
  2. tf.compat.v2.nn.softmax_cross_entropy_with_logits
  3. tf.compat.v2.nn.sparse_softmax_cross_entropy_with_logits

1.x থেকে 2.x এ স্থানান্তর সম্পর্কে আরও তথ্যের জন্য, দয়া করে এই মাইগ্রেশন গাইডটি দেখুন


0

আরও একটি জিনিস যা আমি অবশ্যই লজিট হিসাবে হাইলাইট করতে চাই তা হ'ল একটি কাঁচা আউটপুট, সাধারণত শেষ স্তরের আউটপুট। এটি পাশাপাশি নেতিবাচক মানও হতে পারে। আমরা যদি এটি নীচে উল্লিখিত হিসাবে "ক্রস এন্ট্রপি" মূল্যায়নের জন্য হিসাবে ব্যবহার করি:

-tf.reduce_sum(y_true * tf.log(logits))

তারপর এটি কাজ করবে না। যেমন-লগ-এর সংজ্ঞা দেওয়া হয় না। সুতরাং ও সফটম্যাক্স অ্যাক্টিভেশন ব্যবহার করা এই সমস্যাটি কাটিয়ে উঠবে।

এটি আমার বোঝাপড়া, আমি ভুল হলে আমাকে সংশোধন করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.