使用权值衰减算法解决神经网络过拟合问题、python实现
使用權值衰減算法解決神經網絡過擬合問題、python實現
- 一、what is 過擬合
- 二、過擬合原因
- 三、權值衰減
- 四、實驗驗證
- 4.1制造過擬合現象
- 4.2使用權值衰減抑制過擬合
一、what is 過擬合
過擬合指只能擬合訓練數據,但不能很好擬合不包含在訓練數據中的其他數據的狀態。
二、過擬合原因
模型參數過多、表現力強
訓練數據少
三、權值衰減
這玩意在之前提到過,就是減小權值,通過在學習過程中對大的權重進行懲罰,來抑制過擬合。
深度學習目的是減小損失函數的值,那么為損失函數加上權重平方范數,就可以抑制權重變大。
L2范數是什么,就是相當于各個元素的平方和。如下面數學式子表示。
正則化是什么,regularizer,也就是規則化,也就是,向你的模型加入某些規則。為損失函數加上權重平方范數其實就是加上了正則化項,這個正則化項就是L2范數的權值衰減。
L2范數的權值衰減數學表達:
W是權重。λ是控制正則化強度的超參數,它越大,對權重施加的懲罰越多。二分之一是調整常量,這樣的話,求導后是λW。
求權重的梯度的計算中,要為之前的誤差反向傳播法的結果加上正則化項的導數λW。
四、實驗驗證
4.1制造過擬合現象
我們制造過擬合,就需要增加網絡參數,減少訓練數據,那么就從MNIST數據集里只選出來300個數據,然后增加網絡復雜幅度用7層網絡,每層100個神經元,激活函數ReLU。
代碼:
import os import syssys.path.append(os.pardir) # 為了導入父目錄的文件而進行的設定 import numpy as np import matplotlib.pyplot as plt from dataset.mnist import load_mnist from common.multi_layer_net import MultiLayerNet from common.optimizer import SGD(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True)# 為了再現過擬合,減少學習數據 x_train = x_train[:300] t_train = t_train[:300]# weight decay(權值衰減)的設定 ======================= weight_decay_lambda = 0 # 不使用權值衰減的情況 #weight_decay_lambda = 0.1 # ====================================================network = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100], output_size=10,weight_decay_lambda=weight_decay_lambda) optimizer = SGD(lr=0.01)max_epochs = 201 train_size = x_train.shape[0] batch_size = 100train_loss_list = [] train_acc_list = [] test_acc_list = []iter_per_epoch = max(train_size / batch_size, 1) epoch_cnt = 0for i in range(1000000000):batch_mask = np.random.choice(train_size, batch_size)x_batch = x_train[batch_mask]t_batch = t_train[batch_mask]grads = network.gradient(x_batch, t_batch)optimizer.update(network.params, grads)if i % iter_per_epoch == 0:train_acc = network.accuracy(x_train, t_train)test_acc = network.accuracy(x_test, t_test)train_acc_list.append(train_acc)test_acc_list.append(test_acc)print("epoch:" + str(epoch_cnt) + ", train acc:" + str(train_acc) + ", test acc:" + str(test_acc))epoch_cnt += 1if epoch_cnt >= max_epochs:break# 3.繪制圖形========== markers = {'train': 'o', 'test': 's'} x = np.arange(max_epochs) plt.plot(x, train_acc_list, marker='o', label='train', markevery=10) plt.plot(x, test_acc_list, marker='s', label='test', markevery=10) plt.xlabel("epochs") plt.ylabel("accuracy") plt.ylim(0, 1.0) plt.legend(loc='lower right') plt.show()由圖可看出,過了100個epoch,用訓練數據測得識別精度幾乎為100%,但是測試數據與100%有較大差距,說明,模型對訓練時沒有使用的測試數據擬合的不好。
4.2使用權值衰減抑制過擬合
在上面代碼中修改weight_decay_lambda = 0.1,可以看到如下結果。
測試數據和訓練數據識別精度有差距,但是差距比之前的減小了。
有人說,那他的測試數據識別精度也沒提升啊。
其實這是因為訓練數據的精度也沒到100%哦,如果再有多個訓練數據進入網絡訓練,它精度到100%的時候,測試數據精度就會比之前過擬合時候要高。
總結
以上是生活随笔為你收集整理的使用权值衰减算法解决神经网络过拟合问题、python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: stm32 PWM输入捕获
- 下一篇: 使用反向传播算法计算参数的梯度并用pyt