【CS231n】Spring 2020 Assignments - Assignment1 - Softmax
文章目錄
前言
我的作業是在 Google Colaboratory 上完成的,還是挺方便的。
一、Implement softmax_loss_naive(W, X, y, reg)
邏輯迴歸分類器(Softmax Classifier):希望正確類別得到的概率分數接近 1 ;
Softmax 損失函式(常用,也叫多項式邏輯迴歸):我們用 softmax 對分數進行轉化處理(即不直接使用),並得到正確類別的損失函式是 − l o g P -logP −logP ;公式如下
L i = − l o g ( e s y i ∑ j e s j ) L_i = -\ log(\frac{e^{s_{y_i}}}{\sum_{j}{e^{s_j}}}) Li=− log(∑jesjesyi)
綜上,損失的計算還是比較簡單。先求出分數 Scores,將 Scores 正數化( e S e^S eS),再將 Scores 歸一化,即除以每個資料樣本在每個類的得分總和,這樣就可以得出概率 P 了。那對於每個資料樣本 X i X_i Xi , L i = − l o g ( e s y i ∑ j e s j ) L_i = -\ log(\frac{e^{s_{y_i}}}{\sum_{j}{e^{s_j}}}) Li=− log(∑jesjesyi)。
可是計算梯度 dW 就比較複雜了,因為這個損失函式比較複雜,可以參考下面這篇文章:
多分類器softmax——絕對簡單易懂的梯度推導 by 月下花弄影
裡面講得很詳細。
下面是程式碼:
num_train = X.shape[0]
num_classes = W.shape[1]
scores = X.dot(W)
positive_scores = np.e ** scores
softmax = positive_scores / np.sum(positive_scores, axis=1).reshape((num_train, 1))
for i in range(num_train):
for j in range(num_classes):
if j == y[i]:
loss += -np.log(softmax[i][j])
dW[:, j] += (softmax[i][j] - 1) * X[i]
else:
dW[:, j] += softmax[i][j] * X[i]
loss /= num_train
loss += reg * np.sum(W*W)
dW /= num_train
dW += 2 * reg * W
二、Implement softmax_loss_vectorized(W, X, y, reg)
這題和 SVM 的第二題差不多。損失是比較好求的,比較難的仍然是梯度矩陣。
總體思路是構造出一個矩陣,讓它和 X 點乘能夠得到 dW 。從上一題中我們可以看到 dW[:, j] 都需要加上 X[i] ,只不過當 j = y[i] 時的係數需要減 1 ,那麼很自然的我們先將 softmax 相應的項減去1,再與 X.T 點乘即可得到 dW。當然最後別忘了除以 num_train 以及 進行正則化懲罰。
num_train = X.shape[0]
num_classes = W.shape[1]
dim = X.shape[1]
scores = X.dot(W)
positive_scores = np.e ** scores
softmax = positive_scores / np.sum(positive_scores, axis=1).reshape((num_train, 1))
loss = np.sum((-np.log(softmax))[range(num_train), y])
softmax[range(num_train), y] -= 1
dW = X.T.dot(softmax)
loss /= num_train
loss += reg * np.sum(W*W)
dW /= num_train
dW += 2 * reg * W
三、Write code that chooses the best hyperparameters
這一題的思路跟 SVM 裡面的完全一樣,想看思路的同學可以看我的上一篇部落格。
需要注意的是,我選用的引數都是經過對比、選擇最後得出來的,並不是一開始就將 learning_rate_step_size, regularization_strength_step_size, num_iters 這些引數設成這個值的。
其實研究了一下其他同學的程式碼之後,我嘗試了一下,發現不怕耗費時間的同學真的可以將 num_iters 固定成一個比較大的值,這樣訓練出來的結果會準確很多,對於區間的選擇也更精準。
learning_rate_step_size = (1.288000e-06 - 0.5e-7) / 15
regularization_strength_step_size = (4.200000e+04 - 1e4) / 15
lr = 1e-7 - learning_rate_step_size
regularization_strength = 1e4 - regularization_strength_step_size
best_lr = 0.
best_regularization_strength = 0.
for i in range(15):
lr += learning_rate_step_size
regularization_strength = 1e4
for j in range(15):
regularization_strength += regularization_strength_step_size
new_softmax = Softmax()
new_softmax.train(X_train, y_train, learning_rate=lr, reg=regularization_strength, num_iters=700, verbose=False)
y_train_pred = new_softmax.predict(X_train)
training_accuracy = np.mean(y_train == y_train_pred)
y_val_pred = new_softmax.predict(X_val)
validation_accuracy = np.mean(y_val == y_val_pred)
if validation_accuracy > best_val:
best_val = validation_accuracy
best_softmax = new_softmax
best_lr = lr
best_regularization_strength = regularization_strength
results[(lr, regularization_strength)] = (training_accuracy, validation_accuracy)
# Train best_softmax and update bast_value
best_softmax.train(X_train, y_train, best_lr, best_regularization_strength, num_iters=800, verbose=True)
y_val_pred = best_softmax.predict(X_val)
best_val = np.mean(y_val == y_val_pred)
print('best_lr:', best_lr, 'best_regularization_strength:', best_regularization_strength)
總結
學習CS231n對數學的要求真的蠻高的。
相關文章
- 【CS231n】Spring 2020 Assignments - Assignment1 - Two Layer NetSpring
- cs231n - assignment1 - neural net 梯度推導梯度
- softmax-regression
- Softmax分類函式函式
- Softmax迴歸簡介
- tf中softmax_cross_entropy_with_logits與sparse_softmax_cross_entropy_with_logitsROSGit
- 卷積神經網路系列之softmax,softmax loss和cross entropy的講解卷積神經網路ROS
- softmax負取樣和nce loss
- Keras上實現Softmax迴歸模型Keras模型
- 歸一化(softmax)、資訊熵、交叉熵熵
- 機器學習之多類別神經網路:Softmax機器學習神經網路
- 圖示Softmax及交叉熵損失函式熵函式
- 使用TensorFlow實現手寫識別(Softmax)
- 『cs231n』視訊資料處理
- 論文解讀(GRCCA)《 Graph Representation Learning via Contrasting Cluster Assignments》AST
- 前饋網路求導概論(一)·Softmax篇求導
- 2020-5-23-SpringSpring
- ML-邏輯迴歸-Softmax-交叉熵(小航)邏輯迴歸熵
- 超越Softmax瓶頸:一種高秩RNN語言模型RNN模型
- word2vec原理(二) 基於Hierarchical Softmax的模型模型
- Spring AOP2020-09-29Spring
- [CS231N課程筆記] Lecture 2. Image Classification筆記
- 簡單介紹pytorch中log_softmax的實現PyTorch
- tf.keras實現邏輯迴歸和softmax多分類Keras邏輯迴歸
- spring cloud 2020 gateway 報錯503SpringCloudGateway
- 史丹佛CS231n課程筆記純乾貨2筆記
- 史丹佛CS231n課程筆記純乾貨1筆記
- 數值解和解析解/softmax迴歸/泰勒展開/牛頓法
- 深度學習實驗:Softmax實現手寫數字識別深度學習
- CS231n winter 2016 學習筆記lecture 1筆記
- 微服務 Spring Cloud 2020 重大變革微服務SpringCloud
- Spring Boot面試題(2020最新版)Spring Boot面試題
- Logistic迴歸、softmax迴歸以及tensorflow實現MNIST識別
- 深度學習筆記1:池化 全連線 啟用函式 softmax深度學習筆記函式
- 【TensorFlow篇】--Tensorflow框架實現SoftMax模型識別手寫數字集框架模型
- 李飛飛 CS231n 最全學霸筆記精煉版來了筆記
- Spring Boot基礎面試題2020大集合Spring Boot面試題
- 史丹佛自然語言處理習題課2---softmax函式詳解自然語言處理函式