吴恩达深度学习笔记
你將學習本系列課程(專業):
我的目標
理解深度學習基本原理 常用算法 流程 常用術語 不求算術推導 不求算術推導 不求算術推導 使用深度學習框架
入門介紹
例1 房價預測模型
輸入映射輸出
監督學習有價值的
圖像卷積序列 CNN
時間序列 語言序列 RNN RNNS
深度學習神經網絡
數據量和質量處于第一序列勝過算法
算法主要加速學習速率如
sigmod 函數轉化為ReLU 函數 梯度下降更快
規模推動深度學習進步 1數據2算力3算法
所以 算法 只是第三重要的
課程安排
本課程大綱第一周:介紹
第2周:神經網絡編程基礎
第3周:一個隱層神經網絡
第4周:深度神經網絡
算法 logisttic 回歸 解決二二分類 (二元分類)
最小的神經網絡
二元分類(二分類): 輸入特征向量 輸出 0 or 1
例2:有貓嗎預測
訓練集合樣本
traing={(x1,y1),(.)......}traing = \{(x^1,y^1),(.)......\} traing={(x1,y1),(.)......}
$$
測試集合樣本
logisttic 回歸 函數 sigmoid 是一個方程 S形的
$$
y—=(wT+B)z0<=y<01y^{—} = \frac{(w^T+B)}{z} 0<=y<01 y—=z(wT+B)?0<=y<01
w和b是參數我們通常將其分開作為一個向量參數w 和b是參數 我們通常將其分開作為一個向量參數 w和b是參數我們通常將其分開作為一個向量參數
Θ=[bw0w1w2...]\Theta = \left[\begin{array}{c} b \\w_0\\w_1\\w_2\\... \end{array} \right] Θ=???????bw0?w1?w2?...????????
y^預測值對應的是訓練樣本的輸出\hat{y} 預測值對應的是訓練樣本的輸出 y^?預測值對應的是訓練樣本的輸出
logisttic 的成本函數 回歸損失函數
損失函數
衡量了單個個訓練樣本上的表現
效果近似于方差但后面更好維護
δ(y^,y)=?(ylog(^y)+(1?y)log(1?y^))近似于12(y^?y)2樣本值y^真實值y\delta(\hat{y},y) = -(ylog\hat(y)+(1-y)log(1-\hat{y})) 近似于 \frac{1}{2}(\hat{y}-y)^2 樣本值\hat{y} 真實值y δ(y^?,y)=?(ylog(^?y)+(1?y)log(1?y^?))近似于21?(y^??y)2樣本值y^?真實值y
成本函數
衡量了全體訓練樣本上的表現
J(w,b)=?12∑i=1myilogy^i+(1?y^)J(w,b) = -\frac{1}{2}\sum^{m}_{i=1}y^ilog\hat{y}^i+(1-\hat{y}) J(w,b)=?21?i=1∑m?yilogy^?i+(1?y^?)
梯度下降法
找到凸函數的最低點 即最優解
學習率a
導數即函數的斜率即高除寬
J 成本函數
w:=w?αdJ(w)dww := w-\alpha\frac{dJ(w)}{dw} w:=w?αdwdJ(w)?
反向傳播 backpagagations
反向傳播就是求導
導數
導數大多時候就是斜率 即高除寬
ddaf(a)\fracze8trgl8bvbq{da}f(a) dad?f(a)
導數例子
導數時刻變得
計算圖
流程圖從左到右
計算圖求導
反向求導
鏈式法則
dvar 表示導數
logistic (邏輯)回歸中的梯度下降法
計算偏導數,導數流程圖計
算梯度
logistic 回歸公式
z=wTx+b單個樣本成本函數y^=a=δ(z)成本函數L(a,y)=?(ylog(a)+(1?y)log(1?a))損失函數z = w^Tx+b 單個樣本 成本函數 \\ \hat{y}=a=\delta(z) 成本函數 \\ L(a,y)=-(ylog(a)+(1-y)log(1-a)) 損失函數 z=wTx+b單個樣本成本函數y^?=a=δ(z)成本函數L(a,y)=?(ylog(a)+(1?y)log(1?a))損失函數
dz =a-y
梯度更新過程
m個樣本的梯度下降
向量化
擺脫for 循環的低效率 加速運算
向量計算會比for 循環快300 倍
用numpy 就是np
是在做并行計算
原因SIMD 單指令流多數據流 single instruct mult data
其他向量化例子
這里指的就是numpy 的其他函數
np.log np.abs np.max np.exp。。。。。。 np.zeros(n-x,1)向量化logistic 回歸的梯度輸出
將數據集也向量化
db = 1/m *np.sum(dz)python 中的廣播
術語廣播描述了NumPy在算術運算期間如何處理具有不同形狀的數組。受某些限制,較小的陣列在較大的陣列中“廣播”,以便它們具有兼容的形狀。廣播提供了一種將數組操作矢量化的方法,這樣循環就可以在C語言而不是Python語言中發生。這樣做時不會產生不必要的數據拷貝,通常會導致高效的算法實現。然而,在某些情況下,廣播是一個壞主意,因為它會導致內存使用效率低下,從而降低計算速度。
NumPy操作通常是在逐元素的基礎上對數組進行的。在最簡單的情況下,兩個數組必須具有完全相同的形狀,如下例所示:
broadcasting
卡路里計算
A = np.array([[56,0,4.4,68],[1.2,104,52,8],[1.8,135,99,0.9]]) print(A)cal = A.sum(axis=0)# 豎直方向 cal_ = A.sum(axis=1)# 橫向 print(cal)percentage = 100*A/(cal.reshape(1,4)) print(percentage)python_numpy 向量說明
減少BUG 減少一維的向量
Jupyter_ipython 指南
略
logistic 損失函數
神經網絡概述
多層級結構
神將網絡表示
輸入層為第零層 有時候也不考慮進去
計算神經網絡的輸出
層數和節點數
神經網絡的每一個隱層有多個節點的輸出看作logistic 的輸入到下一層
多個樣本的向量化–模擬神經網絡
激活函數:節點函數
z[1]=W[1]X+B[1]a[1]=σ(z1)z[2]=W[2]a[1]+b[2]a[2]=σ(z[2])z^{[1]}=W^{[1]}X+B^{[1]}\\ a^{[1]}=\sigma(z^{1})\\ z^{[2]}=W^{[2]}a^{[1]}+b^{[2]}\\ a^{[2]}=\sigma(z^{[2]}) z[1]=W[1]X+B[1]a[1]=σ(z1)z[2]=W[2]a[1]+b[2]a[2]=σ(z[2])
向量化實現的解釋
數據轉化向量
激活函數
神經網絡中處理上一層輸出轉化為下一層輸入的函數
σ函數輸出層使用因為介于0?1\sigma 函數 輸出層使用 因為介于0-1 σ函數輸出層使用因為介于0?1
tanh 函數效果更好
$$
$$
ReLU函數 和帶泄露(leaky)的ReLU函數
$$
激活函數為了是梯度快速下降
斜率越小梯度下降越慢
為什么要用非線性激活函數
為什么不把輸出值直接輸出要使用激活函數處理?
若使用恒等激活函數,或者線性激活函數,隱藏層會失效不如去掉神經網絡無法成立–事實證明?
只有機器學習的回歸問題可以使用線性方程如房價預測輸出的是一個實數,隱藏層就是不能用線性
激活函數的導數
激活函數求導過程 略😢
神經網絡的梯度下降法
訓練模型隨機初始化參數很重要
梯度下降更新 步伐根據學習率
直觀理解反向傳播
**前向傳播(Forward Propagation)**前向傳播就是從input,經過一層層的layer,不斷計算每一層的z和a,最后得到輸出y^ 的過程,計算出了y^,就可以根據它和真實值y的差別來計算損失(loss)。
**反向傳播(Backward Propagation)**反向傳播就是根據損失函數L(y^,y)來反方向地計算每一層的z、a、w、b的偏導數(梯度),從而更新參數
正向傳播 反向傳播(求導)
隨機初始化
參數w 偏置項b
w 不要是0會使節點單元變得一樣 b可以
W 不宜太大可能一開始就飽和
減慢學習效率 0.01 左右是合理的
深層網絡中的前向傳播
核對矩陣的維數
搭建深層神經網絡塊
參數& 超參數
超參數:控制參數的參數
如學習率 a 循環的數量 隱層的數量等控制 W和b 的參數 還有momentum ,batch size等
調參很多就是調超參數
和大腦的關系
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5VntkwF9-1651913336000)(C:\Users\renoy\AppData\Roaming\Typora\typora-user-images\image-20220414152711834.png)]、
一個類比蹭熱度用的,也許有收到一些生物學的啟發吧
一些大佬經驗講解分享
ReLU向后傳播
訓練__開發__測試集
訓練集 驗證集(開發集合) 測試集
驗證集一般用于進一步確定模型中的超參數(例如正則項系數、神經網絡中隱層的節點個數,k值等),而測試集只是用于評估模型的精確度(即泛化能力)。
傳統6 -2 -2 ,8 -1 -1
大數據(百萬級別)
98 - 1 -1
測試集 也可以 并入驗證集 就沒有無偏評估集合了
偏差_方差
高偏差
擬合的數據不會是線性的
機器學習基礎
計算偏差 太高訓練集都不行的話 換一個網絡架構訓練
高偏差和高方差是完全不同的情況。解決方法也不一樣
**偏差:**描述的是預測值(估計值)的期望與真實值之間的差距。偏差越大,越偏離真實數據,如下圖第二行所示。
**方差:**描述的是預測值的變化范圍,離散程度,也就是離其期望值的距離。方差越大,數據的分布越分散,如下圖右列所示。
正則化–降低方差
正則化是為了降低方差
過度擬合了數據即存在高方差問題
解決方案
1 正則化
2 準備更多訓練數據
L2 范數正則化也被稱為“權重衰減”
為什么正則化可以減少過擬合
經驗后的結果–懲罰函數
Dropount 正則化
隨機失活
消除一些節點?
理解dropout
不太理解
其他正則化方法
1 數據擴增----造數據
2 early stopping
提早停止訓練
歸一化(標準化)輸入–加速訓練
加速訓練的方法,優化代價函數J
歸一化前后對比
前者學習率很低
梯度消失與梯度爆炸
需要更聰明的隨機初始化權重
W 激活函數
W 比1 的結果是指數爆炸增大
W 比1 小一點的結果是指數遞減
、
神經網絡的權重初始化
解決但不能完全解決梯度消失與梯度爆炸
梯度的數值逼近
雙邊誤差不使用單邊公差
梯度檢驗
向量化 W 矩陣
執行循環 計算雙邊誤差
計算兩個向量的距離 歐式距離,他是誤差平方之和
不明白哦
關于梯度檢驗實現的標記
Mini-batch梯度下降算法
不用等整個數據集處理完再執行下一步
Mini-batch梯度下降算法就是在分割數據的同時分批次執行梯度下降
深度學習高度依賴經驗
算法優化
條件一 向量化計算
當數據很大是 流程如下 處理500w 數據進入下一層 處理500w 數據進入下一層 就會很慢
需要梯度下降法處理一部分
處理思路分割數據集 這些子集被稱之為Mini-batch 如一次1000 個數據 一組一組進去 ,有5000 組
需要遍歷數據集了 ,遍歷還是少不了的😄
理解mini-batch size梯度下降
遍歷讓每次迭代的成本降低了
每次迭代都是訓練不同數據
每次計算成本下降
舉個例子
隨機梯度下降 size = 1 隨機梯度下降 等于一個接著一個計算沒有向量計算了 low
梯度下降 size = m 全部向量化 數據多了頂不住 low
所以選擇size 很重要
指數加權平均(指數加權移動平均)
比梯度下降快的算法需要用到
調整貝塔 參數 調參數調參數
理解指數加權平均
用之前數據對之后的數據影響有多大
指數加權平均的偏差修正
一些算法
為了加速訓練
局部最優的問題
導數接近0下降很慢了
調試處理
超參數選擇–玄學
為超參數選擇合適的范圍
隨機均勻取值
超參數訓練的實踐:Pandas VS Caviar
超參數調整 可能是一直要調整的
兩種策略 1 不停迭代一個模型持續優化 2 大量模型一起訓練 的最優的
正則化網絡的激活函數
將Batch Norm (Batch 歸一化)擬合進神經網絡
加速學習
擬合就是把平面上一系列的點,用一條光滑的曲線連接起來。因為這條曲線有無數種可能,從而有各種擬合方法。
Bath Norm 為什么奏效
測試時的Batch Norm
Softmax 回歸
分類器 用來決定邊界
訓練一個Softmax 分類器
對應的是 hardmax 即輸出的是一個概率
深度學習框架
專注于正向傳播框架計算反向傳播
數據參數是對的其他自動了
TensorFlow
只需要清楚的正向傳播流程
框架實現反向傳播和梯度計算
import numpy as np import tensorflow as tf w = tf.Variable # w 我們要優化的參數 tensor 變量 coefficients = np.array([[1.],[-10.][25.]])x = tf.placeholder(tf.float32,[3,1]) # 定義 引入參數x 稍后把把常量放入 # cost = tf.add(tf.add(w**2,tf.multiply(-10,w)),25) # 定義損失函數 # cost = w**2 - 10*w +25 # 定義損失函數 (w-5)**2 cost = x[0][0]*w**2 +x[1][0]*w +x[2][0] # 定義損失函數 train = tf.train.GradientDescentOptimizer(0,0.01).minimize(cost) init = tf.global_variables_initializer()session = tf.Session() # with tf.Session() as session session.run(init) print(session.run(w)) # 什么都沒做 -->0 session.run(train) # 運行下一步的梯度下降法 print(session.run(w)) # -->0.1 迭代1000次 for i in range(1000):session.run(train,feed_dict={x:coefficients})# 把不同的mini_batch 放入 損失函數需要的地方 print(session.run(w)) # -->4.99999訪談大佬二
1 研究方向有無監督 產品化有監督 六個月入行沒問題 計算機和數學的知識 概率代數最優化微積分
2 PaddlePaddle 之類的平臺提供資源
為什么是 ML策略
當準確率不夠了 1 更多的數據 2 數據的多樣性 3 訓練的再久一點 4 算法更新 5網絡更新
正交化
每個維度負責一個方向
超參數解耦
1 先到能接受的程度
單一數字評估指標
參數分類指標可視化
滿足和優化指標
訓練 - 開發- 測試集劃分
設立開發集和目標
開發集合測試集的大小
沒有單獨的測試集合也可以
測試集合和開發集合合并為開發集合(數據大的時候)
什么時候該改變開發-測試集和指標
業務 錯誤率
分類器
為什么是人的表現
根據用戶實際情況修改數據
可避免偏差
理解人的表現
貝葉斯錯誤替代
超過人的表現
改善模型的表現
進行誤差分析
消除標注錯誤的數據
先看錯誤率
快速搭建你的第一個系統,并進行迭代
在不同的劃分上進行訓練并測試
語音識別
不匹配數據劃分的偏差和方差
數據不匹配 開發集錯誤
解決數據不匹配
數據增強 造數據
遷移學習
不同場景可以復用 串行學習?
預訓練和微調學習來源的權重
從一個任務中學習,然后遷移到不同任務中去
多任務學習
多個任務中并行學習而不是串行
多任務學習不同任務的數據量要對等
區別 遷移學習:一次解決 多個任務而不是試圖用A 的解決B
遷移學習使用頻率更高一些
場景 有一個好的網絡 少量的數據 現在可以使用遷移學習了,迭代訓練
什么是端到端的深度學習
忽略所有中間階段 一個神經網絡代替它
例子1 語音識別 x --> y
傳統的 x --> 特征提取 --> 算法找音位(基本單位)—> 中間件 一步一步 找到 y
端到端
x -> y
大數據使用端到端效果 比傳統還好
例子2 人臉識別門禁
輸入的數據其實是多步的 1 檢測器找人臉位置 2 放大人臉剪裁到居中位置
這個例子中 沒有使用端到端 因為 拆分之后獲取數據,訓練更簡單 ,如果可以拆成多個簡單的任務效果也會比端到端好
總結來說沒有足夠的數據來支撐端到端就使用分階段解決的方式
是否要用端到端的深度學習
1 好處是只要數據 不要過程
2 壞處是沒有過程
還是分步的更有前景因為端到端的數據太難收集了
大佬訪問3
1 機器學習是人工智能的優雅實現 輸入數據代碼自動修正 深度學習 監督學習效果真好 —知道底層不要隨便抽象化。從0開始實現一遍不要一開始就用Tensorflow
2 算力提升 推動了 預訓練到標準反向傳播的轉變
計算機視覺
目標檢測
風格遷移
圖片 數據量【x*y*3】 3 個通道
卷積運算使得處理圖片不需要如此巨大的內存
邊緣檢測實例—卷積運算
檢測邊緣 -> 局部-> 整體
過濾器 卷積核
每個對應位置相乘加起來
過濾器(卷積核)在 原圖上計算 得到新的結果 使原圖變小
Keras
為什么卷積可以做垂直邊緣檢測
垂直邊緣檢測
更多邊緣檢測內容
水平邊緣檢測
各種濾波器
九個數字當成參數 自定義各種濾波器
Padding (填充)-- 一個基本卷積操作
卷積生成公式
n?n卷f?f(過濾器)=n?f+1?n?f+16?6?3?3=4?4n*n 卷 f*f(過濾器) = n-f+1 * n-f+1 \\ 6*6 * 3*3 = 4*4 n?n卷f?f(過濾器)=n?f+1?n?f+16?6?3?3=4?4
卷積的缺點
1 輸出縮小:圖片多次卷積之后會不斷縮小最終 1*1
2 信息丟失:最邊緣的像素 只被一次使用 (一些圖片處理中會造成毛邊)
Padding(填充)解決這兩個問題
在圖像邊緣填充一層像素
n+2p?f+1?n+2p?f+1填充之后的n+2p-f+1 * n+2p-f+1 填充之后的 n+2p?f+1?n+2p?f+1填充之后的
Valid(不填充) 和 Same(相同) convolution(卷積)
為了保障 輸出后的圖片等于原圖
n+2p?f+1=n??>p=f?12n+2p-f+1 = n --> p = \frac{f-1}{2} n+2p?f+1=n??>p=2f?1?
f 大都是奇數 原因
1 偶數只能填充不對稱了
2 奇數 的卷積核會有一個中點像素,相鄰關系更好計算
卷積步長
當步長為二
!
商不是整數向下取整,原因是過濾器移動到超出原圖的位置就不要操作了
地板除 [z] = floor(z)
[n+2p?fs+1]?[n+2p?fs+1]卷積結果[\frac{n+2p-f}{s} +1] * [\frac{n+2p-f}{s} +1] 卷積結果 [sn+2p?f?+1]?[sn+2p?f?+1]卷積結果
卷積的結果需要鏡像&反轉
互相關(卷積) 反轉可以省略
三維卷積
三維計算
立體卷積真的很有用
單層卷積網絡
過濾器 填充層 步幅
簡單卷積網絡實力
![外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-70xrhggj-1651913336015)(C:\Users\renoy\AppData\Roaming\Typora\typora-user-images\image-20220428172829147.png)]
池化層
保留特征輸出
卷積層和池化層區別
卷積層
功能 提取特征
操作 對于三維數據比如RGB圖像(3通道),卷積核的深度必須同輸入的通道數,輸出的通道數等于卷積核的個數。卷積操作會改變輸入特征圖的通道數。
特性 權值共享:減少了參數的數量,并利用了圖像目標的平移不變性。稀疏連接:輸出的每個值只依賴于輸入的部分值。
池化層
功能 壓縮特征圖,提取主要特征
操作 池化只是在二維數據上操作的,因此不改變輸入的通道數。對于多通道的輸入,這一點和卷積區別很大。
全鏈接卷積神經網絡事例
這里一個卷基層包含一個卷基層和一個池化層
Conv1 + POOL1 作為Layer1
盡量不要自己設置超參數,看被人用的什么(好家伙又省了一步)
卷積層 + 池化層 + 全連接層
為什么要使用卷積
卷積層的兩個優勢(對比只有全連接層)
參數共享 減少計算量
沒有卷積,參數很多(1200w )訓練量
加入過濾器 參數很少了(5*5)
稀疏連接
元素連接的關系 不是所有關聯的
如下圖中的一個框個過濾器 映射到結果中的一個格子 和其他的沒有關聯關系了,特征于特征(格子和格子)之間沒有過多的關聯
為什么要進行事例研究
視覺方向的網絡遷移很簡單
1 如 識別貓的網絡 遷移到 識別狗 ,人,車
下面一章就可以開始看論文了
Classic networks(經典網絡)
每一次卷積池化圖像都會縮小
LeNet-5
結構
AlexNet
結構
VGG
結構
ResNet 殘差網絡
很深的網絡很難訓練因為存在梯度消失和梯度爆炸
CNN中深度可能有幾種情況,這兒總結一下。
遠眺連接
ResNet 模型 何凱明 使得 模型可以很多層的疊加
正常的達到峰值后繼續迭代錯誤會增多效果會更差ResNet 模型 解決了這個問題
通過殘差塊
殘差網絡為什么有用?
底層原因:殘差學習恒等函數非常容易,可以提升網絡性能
對比
網絡中的網絡以及1*1 卷積
1*1 的卷積單元可以理解為 全部應用了一個神經網絡
谷歌Inception 網絡
1*1 卷積構建Inception 網絡
壓縮信道
作用:不想決定池化層是使用1*1 3*3 還是 5*5 的過濾器 就使用Inception 使用各種類型的過濾器 只需要把輸出連接起來
Inception 網絡
這些分支的作用 給最后的softmax(推理層) 層做一個補充
使用開源的實現方案
gitHup 使用
遷移學習
使用預訓練模型 別人訓練好的模型
凍結一部分網絡 訓練 如果數據少 如果多的話少凍結一些
數據擴充
1 鏡像對稱和隨機剪裁
2 色彩轉換
計算機視覺現狀
少數據的地方應用到大數據的地方 —> 泛化
沒有標注數據的時候考慮手工工程
10-corp 造數據
目標定位
例子: 車輛預測 分類模型
輸出類型外還有輸出位置框 bx,by,bh,bw
回歸任務
特征點檢測
神經網絡識別 特征的坐標
列子: 人臉特征點檢測 129 個特征點檢測
批量添加輸出單元,輸出要識別的各個特征點的坐標
目標檢測
滑動窗口目標檢測
1 先輸入剪裁過只有車的圖片
2 檢測框卷積滑動
3 加大檢測框
缺點:計算成本
滑動窗口目標檢測實踐
第一 全連接層轉化為卷積層
輸出層在左上角
Bounding Box 預測
比卷積滑動窗口更快 ,但不能輸出最精準的邊界框
YOLO 算法得到更精準的框
網格分割 圖片
交并比—IOU
下圖中紅框為標注部分,紫框是模型檢測部分
IOU Intersection over Union
計算兩個邊界框交際并集只比
交集并集\frac{交集}{并集} 并集交集?
一般IOU 大于0.5 就是檢測正確 完美情況為1
非極大值抑制
通過算法高亮正確的檢測框去變暗去除多余的檢測框
Anchor Boxes
一個格子可以檢測多個對象的方法
一個橫向一個縱向的框
YOLO算法
推理預測
候選區域
R-CNN 帶區域的卷積網絡 :先通過 分割算法 分割去除一些肯定沒有的區域
什么是人臉識別
驗證和識別
人臉驗證有一定難度在于準確率 在于一次學習問題
One-Shot 學習
人臉相似度計算 設定閾值 大于閾值不是一個人小于則是一個人
Siamese 網絡
人臉圖片編碼
Triplet 損失
三元組損失
面部驗證與二分類
人臉識別問題轉化為二分類問題
什么是神經風格轉換
圖片風格遷移 — 相片濾鏡
卷積提取特征
什么是深度卷積網絡
尋找接受域
每一層的卷積的范圍不斷放大
第一層檢測邊緣 第二層 檢測質地 第三層一些復雜 。。。。。
代價函數
需要定義一個代價函數
定義帶教函數
J(G)=αJcontent(C,G)+βJstyle(S,G)J(G) = \alpha J_{content}(C,G) + \beta J_{style}(S,G) J(G)=αJcontent?(C,G)+βJstyle?(S,G)
使用預訓練的卷積模型 比如VGG模型
風格代價函數
檢查風格圖片相關性 比如垂直風格
一維到三位推廣
一些總結
為什么選擇序列模型
序列模型也有很多不同的類型
數學符號
例子: NLP
詞典建立
3w-5w 詞小型的 大型最大可能100w
one-hot
這里用了一個10000 維的向量表示一個一萬的詞的詞典
每個詞在指定位置有對應關系 0 不存在 1 存在 UNK 未收錄單詞 全部為后面矩陣計算做準備
循環神經網絡 RNN
循環神經網絡 廣泛用于NLP方向
比如說需要得到 Teddy 這個人名 需要通過時序模型結合上下文看
激活函數&損失函數
a1=g(waa0+wax1+b)y^1=h(wya1+by)a^1 = g(w{aa}^0+w_{ax}^1+b) \\\hat{y}^1 = h(w_{ya}^1+b_y) a1=g(waa0+wax1?+b)y^?1=h(wya1?+by?)
通過時間的反向傳播
框架中反向傳播是自動進行的,但還是了解一下最好
通過時間(穿越時間)的反向傳播
不同類型的循環神經網絡 -RNN
循環神經網絡不合理的有效性
基本的RNN 一個輸入對應一個輸出
例子: 語言翻譯 輸入句子和輸出句子長度很可能不一致
不再每個節點上有輸入而是RNN 網絡讀完整個句子
多個輸入一個輸出
或者一個輸入多個輸出
總結各個結構的RNN
一對一 標準的網絡結構 不需要RNN 也可
一對多 如音樂生成 序列生成
多對一 如情感分類
多對多 機器翻譯
語言模型和序列生成
語音識別系統
softmax 預測每個詞的概率
新序列采樣
將語音轉化為新的字符序列 從字符字典中取到對應的放入
但現在更多的是基于詞匯的而不是基于字符字母的詞典
帶有神經網絡的梯度消失
命名識別識別
RNN 有著巨大缺陷
梯度消失& 梯度爆炸 --很深的網絡會有這個問題
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mmuwkKGO-1651913336027)(C:\Users\renoy\AppData\Roaming\Typora\typora-user-images\image-20220506111131529.png)]、
梯度爆炸比較魯棒的解決方案
梯度裁剪
GRU 單元 門循環控制單元
改善梯度消失
在保留長期序列信息下減少梯度消失問題
Γ表示門大寫的γ\Gamma 表示門 大寫的\gamma Γ表示門大寫的γ
門控循環單元 改變了隱藏層 捕捉深層鏈接 改善了梯度消失問題
記憶細胞 GRU 輸出激活值
GRU 輸入上一個時間單元
長短期記憶(LSTM) 更優的選擇
比GRU 更有效 是GRU 的更強大的通用版本
GRU 有兩個門 LSTM 是三個門
結合更新和遺忘門的概念
update forget output
對比
流程
bidirectional RNN 雙向RNN BRNN
更好的構建RNN 方法 BRNN
不僅可以獲得過去的數據還能獲得未來的數據
在僅根據之前的數據無法進行預測的時候可以加入后面的數據一起預測
對比
原始RNN 都是向前的只能獲得前面的數據
**BRNN **
加入了一個反向序列
深層循環神經網絡 Deep RNN
另一種RNN 升級版
有三個隱層的網絡
因為RNN 包含時間序列所以無法有太多的隱層結構 計算資源很大
詞匯表征
one-hot 表示法
每個詞都是字典里面唯一的,用向量表示
缺點 每個詞是孤立的,對相關詞的泛化性不強
詞的相關性 權重
特征可視化算法 t-SNE算法
詞嵌入
使用詞嵌入
詞嵌入是NLP 的重要概念
作用 可以將同類的詞聚類使用
通過大量無標簽的文本進行詞嵌入 (無監督?)
詞嵌入和人臉編碼之前有一些關聯
人臉編碼 : 通過比對128 維的比對是否是一個人
詞嵌入的特性
幫助類比推理
詞向量
余弦相似度
余弦相似度對這種類比工作效果很不錯 歐式距離也可以不過沒有余弦用的多
嵌入矩陣
詞嵌入實現 —> 嵌入矩陣
計算實現效率很低 ,因為 one-hot 矩陣的維度非常多,并且基本所有元素都是0,所以矩陣相乘效率很低
學習詞嵌入
Word2Vec
一種簡單=高效的計算方式
預測
分類器提速 樹形結構
如何對上下文c 進行采樣?
1 均勻且隨機地采樣 有問題 停用詞那些
負采樣
巧妙的進行采樣
一個監督學習模型
核心作用降低學習成本將其轉化為 二分類問題
下載他人的詞向量是一個很好的方法
GloVe 詞向量 算法
用的不是很多
情緒分類
NLP 的重要方向
如根據評價評星
問題
標記的訓練集沒有那么多
使用詞向量更準確
使用RNN
詞嵌入除偏
大量的數據學習可能學到一些不好的東西 比如 男性–> 醫生 女性—> 護士 黑人–> 窮 白人—> 富
偏見趨勢
基礎模型
sequence2sequence(序列2序列) model
如翻譯模型
imahe2sequence 圖像2序列
選擇 最可能的句子
對比語言模型和機器翻譯
幾乎一樣
算法搜索最大可能性
為什么不用貪心搜索 gready search
第一 每次挑選一個最佳值 局部最優全局可能不是
第二 計算量大
定向搜索 – 集束搜索
例子語音識別
集束寬
每次考慮多值 得到概率
改進定向搜索
改變束寬的大小
定向搜索的誤差分析
評估誤差 來自RNN 還是束搜索算法
Case1 是束搜索算法 的問題
Case 2 是RNN 的問題
Bleu 得分
機器翻譯的準確性怎么衡量? 沒有固定值
通過Bleu 來衡量
觀察輸出的每一個詞
注意力模型直觀理解
使得RNN 運行得更好
不同塊上放不同注意力
使用注意力機制 計算注意力
語音辨識
seq2seq 模型在語音識別方面的應用很有生肖
語音轉文本
音位構建的系統被end-to-end 端到端模型取代
注意力機制應用其中
CTC 做語音識別
Connectionist temporal classification)
觸發字檢測
語音設備的喚醒詞 語音助手
總結
總結
- 上一篇: 计算机专业毕业论文选题方向,计算机毕业方
- 下一篇: c语言dll注入进程,DLL注入--设置