星期六, 01. 六月 2019 03:22下午
- 注: 博客關于監(jiān)督學習內(nèi)容參考李航《統(tǒng)計學習方法》第一版高氮,目前該書已經(jīng)于5月份已經(jīng)出了第二版卑惜,在原來監(jiān)督學習的基礎上加入了非監(jiān)督學習的內(nèi)容。
- 深度學習內(nèi)容為筆者實踐中總結出來的些許經(jīng)驗,與大家一起分享。
- 理解基本概念對以后的學習很重要。
一射亏、監(jiān)督學習基本概念
1 問題的形式化
統(tǒng)計學習包括監(jiān)督學習、半監(jiān)督學習腻脏、非監(jiān)督學習和強化學習鸦泳。
監(jiān)督學習假設輸入與輸出的隨機變量和
遵循聯(lián)合概率分布
,但是實際中永品,聯(lián)合概率分布的定義是未知的做鹰。但是,統(tǒng)計學習認為數(shù)據(jù)存在一定的統(tǒng)計規(guī)律---數(shù)據(jù)(訓練數(shù)據(jù)和測試數(shù)據(jù))是由聯(lián)合概率分布
獨立同發(fā)布產(chǎn)生的鼎姐。這是監(jiān)督學習關于數(shù)據(jù)的基本假設钾麸。
監(jiān)督學習的目的在于學習一個由輸入到輸出的映射(模型)更振,這個模型可以是概率模型,也可以是非概率模型
饭尝,非概率模型也就是決策函數(shù)肯腕。在預測時(假設測試集輸入為
,概率模型的輸出為
, 決策函數(shù)的輸出為
钥平。
2 損失函數(shù)(結構風險與經(jīng)驗風險)
損失函數(shù)是用來度量預測錯誤的程度实撒,常用的有0-1損失函數(shù),平方損失函數(shù)涉瘾,絕對值損失函數(shù)和對數(shù)損失函數(shù)知态,損失函數(shù)由記號表示。顯然損失函數(shù)越小立叛,模型就越好负敏,由于模型輸入輸出遵循聯(lián)合概率分布,損失函數(shù)的期望為:
這是理論上模型關于聯(lián)合分布在平均意義下的損失秘蛇,稱為風險函數(shù)其做。實際中,在給定訓練集,模型關于訓練集的平均損失為經(jīng)驗風險:
按照經(jīng)驗風險模型最小化求最優(yōu)模型就是求解最優(yōu)化問題:
但是赁还,當樣本容量很小時妖泄,經(jīng)驗風險最小化學習的效果未必好,會產(chǎn)生過擬合秽浇,結構化風險是為了防止過擬合而提出來的策略浮庐。結構化風險等價于正則化,結構化風險的定義為:
其中為模型復雜度柬焕,
是系數(shù),用以權衡經(jīng)驗風險和模型復雜度梭域。結構風險小的模型往往對訓練數(shù)據(jù)以及未知數(shù)據(jù)有較好的預測斑举,它的最優(yōu)化問題為:
3 正則化與S折交叉驗證
即為正則項,正則項一般是模型復雜度的單調(diào)遞增函數(shù)病涨。例如回歸問題中富玷,損失函數(shù)是平方損失函數(shù),正則項可以是參數(shù)向量的
范數(shù):
正則項可以是參數(shù)向量的范數(shù):
S折交叉驗證為應用最多的交叉驗證方法(主要用于選參數(shù))既穆,方法如下:
- 首相隨機地將已知數(shù)據(jù)切分為S個互不相交的大小相同的子集赎懦;
- 然后利用S-1個子集的數(shù)據(jù)訓練模型,利用余下的子集訓練模型幻工;
- 將這一過程重復S次
- 最后選擇S次測評中平均測試誤差最小的模型
二励两、深度學習訓練模型基礎
深度學習訓練模型筆者也是剛剛開始,筆者這次用的模型是多層LSTM+FC囊颅,主要用于時間序列(故障信號)的分類当悔,這次講的主要是一些如何控制過擬合和如何提高訓練的速度傅瞻。
1 提高GPU的利用率
GPU的利用率高低對于合理利用GPU很重要,在訓練模型時盲憎,非常有必要將利用率提高到80%以上嗅骄,主要有兩個方法:
(1) 控制GPU內(nèi)存,用如下代碼實現(xiàn)
import os
os.environ["CUDA_VISIBLE_DEVICES"] = '0' # 使用GPU: 0
config = tf.ConfigProto()
# config.gpu_options.per_process_gpu_memory_fraction = 0.5 # 程序最多只能占用指定gpu50%的顯存
config.gpu_options.allow_growth = True # 根據(jù)運行需求分配GPU內(nèi)存
sess = tf.Session(config=config)
(2) 減少數(shù)據(jù)頻繁讀寫
數(shù)據(jù)頻繁讀寫會使得GPU的利用率在0~100%之間快速的變化饼疙,此時GPU平均的利用率就很低溺森,遇到這種情況,需要增加batch_size窑眯,減慢數(shù)據(jù)的頻繁讀寫屏积,增大GPU的利用率。
2 train loss 與 validation loss 結果分析
- train loss 不斷下降伸但,validation loss不斷下降肾请,說明網(wǎng)絡仍在學習;
- train loss 不斷下降,validation loss趨于不變更胖,說明網(wǎng)絡過擬合;
- train loss 趨于不變铛铁,validation loss不斷下降,說明數(shù)據(jù)集100%有問題;
- train loss 趨于不變却妨,validation loss趨于不變饵逐,說明學習遇到瓶頸,需要減小學習率或批量數(shù)目;
- train loss 不斷上升彪标,validation loss不斷上升倍权,說明網(wǎng)絡結構設計不當,訓練超參數(shù)設置不當捞烟,數(shù)據(jù)集經(jīng)過清洗等問題薄声。
3 采用early stop 控制過擬合
常用控制過擬合的方式有drop regularization (增加數(shù)據(jù)量),筆者這次主要講early stop中的一種常用的實現(xiàn)方法:即當網(wǎng)絡在連續(xù)多次訓練中题画,validation loss趨于不變默辨,網(wǎng)絡就停止。具體的代碼實現(xiàn)如下:
# previous_loss 前一次的loss
# current_loss 當前的loss
# Max_N 可以允許的n最大值
# Th_loss 可以允許的最大loss差值
# epoch 迭代周期
# best_iteration 最佳迭代次數(shù)
if abs(current_loss - previous_loss) < Th_loss:
n += 1
if n > Max_N:
best_iteration = epoch + 1
break
else:
n = 0
previous_loss = current_loss
4 歸一化和shuffle+(repeat)
采用歸一化和shuffle主要目的是為了提高網(wǎng)絡的訓練速度苍息。
采用StandardScaler()歸一化的代碼如下:
from sklearn.preprocessing import StandardScaler
ss = StandardScaler().fit(train_x)
train_x = ss.transform(train_x)
test_x = ss.transform(test_x)
shuffle的代碼實現(xiàn)有很多種方式缩幸,可以是一周期shuffle一次或多次,也可以是每個batch shuffle一次或者多次
5 模型保存與加載
筆者這里只介紹保存全部模型(圖和變量)竞思,加載整個模型的方式表谊。
首先是保存整個模型:
saver = tf.train.Saver()
saver.save(sess, "./my_model_20190528/my_model_20190528")
保存結束后,在文件夾 my_model_20190528下面有4個子文件盖喷,分別為checkpoint my_model_20190528.data-00000-of-00001 my_model_20190528.index my_model_20190528.meta
然后在另一張圖上加載剛剛保存的模型:
# 導入保存的圖
new_saver = tf.train.import_meta_graph('./my_model_20190528/my_model_20190528.meta')
# 加載需要run的變量
graph = tf.get_default_graph()
accuracy = graph.get_tensor_by_name("Mean_1:0")
X = graph.get_tensor_by_name("Placeholder:0")
y = graph.get_tensor_by_name("Placeholder_1:0")
keep_prob = graph.get_tensor_by_name("Placeholder_2:0")
# 加載保存的模型
sess = tf.Session()
new_saver.restore(sess, './my_model/my_model')
keep_prob 在測試的時候應該設置為1.0
下次繼續(xù)分享爆办,歡迎留言