大家好,又见面了,我是你们的朋友全栈君。
softmax与svm很类似,经常用来做对比,svm的loss function对wx的输出s使用了hinge function,即max(0,-),而softmax则是通过softmax function对输出s进行了概率解释,再通过cross entropy计算loss function。
将score映射到概率的softmax function:,其中,,j指代 i-th class。
对于某一个样本如 的lost function为.
(注:
1、以下所有的公式为了便于表达,设定只有一个样品,即L_i全部写做 L
2、公式中没有进行偏移,实际算法为了避免指数计算容易越界,需要另做偏移处理)
需要求loss function对W的导数(梯度),实际上是进行链式求导。
从最内层的开始,,其中,令 已知
且有,。
那么(3)式则可以根据(4)(5)(6)写成(注意,下面用作为h的简写)
。
根据链式法则:(,y是一个只有一个元素为1,其余为0的向量,真正的分类时y_i=1)
最后一步,因为,这儿i代表第i个类别。
所以:(上面设定了x只有一个,但实际x有n个,是矩阵而非向量)。
上面的公式用代码表示如下:
for ii in range(num_train):
current_scores = scores[ii, :]
# Fix for numerical stability by subtracting max from score vector.
# important! make them range between infinity to zero
shift_scores = current_scores - np.max(current_scores)
# Calculate loss for this example.
loss_ii = -shift_scores[y[ii]] + np.log(np.sum(np.exp(shift_scores)))
loss += loss_ii
for jj in range(num_classes):
softmax_score = np.exp(shift_scores[jj]) / np.sum(np.exp(shift_scores))
# Gradient calculation.不懂这儿为什么要乘以x[ii]
if jj == y[ii]:
dW[:, jj] += (-1 + softmax_score) * X[ii]
else:
dW[:, jj] += softmax_score * X[ii]
# Average over the batch and add our regularization term.
loss /= num_train
loss += reg * np.sum(W*W)
# Average over the batch and add derivative of regularization term.
dW /= num_train
dW += 2*reg*W
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/153123.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...