日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lesson 13.5 Xavier方法与kaiming方法(HE初始化)

發布時間:2025/4/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lesson 13.5 Xavier方法与kaiming方法(HE初始化) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Lesson 13.5 Xavier方法與kaiming方法(HE初始化)

??在進行了一系列的理論推導和代碼準備工作之后,接下來,我們介紹參數初始化優化方法,也就是針對tanh和Sigmoid激活函數的Xavier方法,以及針對ReLU激活函數的Kaiming方法(HE初始化)。當然,在經過漫長的準備工作之后,實際落地應用過程并不會太過于復雜。

一、Xavier方法

1.Xavier初始化參數方法基礎理論

??回顧Glorot條件,我們要求正向傳播時候數據流經每一層前后的方差一致,并且反向傳播時候數據流經每一層,該層梯度前后方差一致。我們將前者稱為向前傳播條件,后者稱為反向傳播條件。我們先看當向前傳播條件成立時候,有如下計算過程。

首先,數據流至某一層時,該層神經元接收到的數據可以通過如下方法算得:
zj=∑i=1nwixiz_j = \sum^n_{i=1}w_ix_izj?=i=1n?wi?xi?
其中zjz_jzj?表示當前某層神經元接收到的數據,xix_ixi?表示上一層某神經元傳出的數據,wiw_iwi?代表連接對應兩個神經元之間的權重,當然,如果我們將zjz_jzj?xix_ixi?wiw_iwi?看成是隨機變量,則上式就能夠表示計算過程的一般情況。并且wiw_iwi?xix_ixi?的方差計算過程如下:
Var(wixi)=E[wi]2Var(xi)+E[xi]2Var(wi)+Var(wi)Var(xi)Var(w_ix_i) = E[w_i]^2Var(x_i)+E[x_i]^2Var(w_i)+Var(w_i)Var(x_i)Var(wi?xi?)=E[wi?]2Var(xi?)+E[xi?]2Var(wi?)+Var(wi?)Var(xi?)

上述過程涉及基礎數學知識,設X為隨機變量,D(X)D(X)D(X)表示X方差,E(X)E(X)E(X)表示其期望,則有:D(X)=E(X2)?E(X)2D(X)=E(X^2)-E(X)^2D(X)=E(X2)?E(X)2
進一步,如果X、Y表示隨機變量并且相互獨立,則有:D(XY)=E((XY)2)?(E(XY))2=E(X2)E(Y2)?(E(X)E(Y))2D(XY)=E((XY)^2)-(E(XY))^2=E(X^2)E(Y^2)-(E(X)E(Y))^2D(XY)=E((XY)2)?(E(XY))2=E(X2)E(Y2)?(E(X)E(Y))2
并且對其進行簡單變形,可以得出:D(XY)=E(X)2D(Y)+E(Y)2D(X)+D(X)D(Y)=E(X)2[E(Y2)?E(Y)2]+E(Y)2[E(X2)?E(X)2]+[E(X2)?E(X)2][E(Y2)?E(Y)2]=E(X)2E(Y2)?E(X)2E(Y)2+E(Y)2E(X2)?E(Y)2E(X)2+E(X2)E(Y2)?E(X)2E(Y2)?E(X2)E(Y)2+E(X)2E(Y)2=E(X2)E(Y2)?E(X)2E(Y)2\begin{aligned} D(XY) &=E(X)^2D(Y)+E(Y)^2D(X)+D(X)D(Y) \\ &= E(X)^2[E(Y^2)-E(Y)^2]+E(Y)^2[E(X^2)-E(X)^2]+[E(X^2)-E(X)^2][E(Y^2)-E(Y)^2] \\ &= E(X)^2E(Y^2)-E(X)^2E(Y)^2+E(Y)^2E(X^2)-E(Y)^2E(X)^2+E(X^2)E(Y^2)-E(X)^2E(Y^2)-E(X^2)E(Y)^2+E(X)^2E(Y)^2 \\ &= E(X^2)E(Y^2)-E(X)^2E(Y)^2\\ \end{aligned}D(XY)?=E(X)2D(Y)+E(Y)2D(X)+D(X)D(Y)=E(X)2[E(Y2)?E(Y)2]+E(Y)2[E(X2)?E(X)2]+[E(X2)?E(X)2][E(Y2)?E(Y)2]=E(X)2E(Y2)?E(X)2E(Y)2+E(Y)2E(X2)?E(Y)2E(X)2+E(X2)E(Y2)?E(X)2E(Y2)?E(X2)E(Y)2+E(X)2E(Y)2=E(X2)E(Y2)?E(X)2E(Y)2?

其中Var()表示方差計算,E()表示均值計算。由于我們假設參數是以0為均值的均勻分布或者0為均值的正態分布,因此E(wi)=0E(w_i) = 0E(wi?)=0,而此前我們介紹,假設輸入數據是Zero-Centered的,因此E(xi)=0E(x_i)=0E(xi?)=0,所以上式可進一步簡化為:
Var(wixi)=Var(wi)Var(xi)Var(w_ix_i) = Var(w_i)Var(x_i)Var(wi?xi?)=Var(wi?)Var(xi?)
而對于z來說,z=∑i=1nwixiz = \sum^n_{i=1}w_ix_iz=i=1n?wi?xi?,其方差計算過程如下:
Var(z)=∑i=1nVar(wixi)=∑i=1nVar(wi)Var(xi)Var(z) = \sum^n_{i=1} Var(w_ix_i) = \sum^n_{i=1} Var(w_i)Var(x_i)Var(z)=i=1n?Var(wi?xi?)=i=1n?Var(wi?)Var(xi?)

此處補充數學過程,D(X+Y)=D(X)+D(Y)+COV(X,Y)D(X+Y)=D(X)+D(Y)+COV(X,Y)D(X+Y)=D(X)+D(Y)+COV(X,Y)
其中COV(X,Y)COV(X,Y)COV(X,Y)是二者的協方差,當X、YX、YXY相互獨立時,COV(X,Y)=0COV(X,Y)=0COV(X,Y)=0

此時,我們可以認為x和w是獨立同分布的(一個是采集處理后的數據,一個是隨機生成的參數),因此每個Var(wi)Var(xi)Var(w_i)Var(x_i)Var(wi?)Var(xi?)也是獨立同分布的,因此所有的wiw_iwi?都可以用一個隨機變量www表示,所有的xix_ixi?也可以用一個隨機變量xxx表示,上式可進一步簡寫為:
Var(z)=∑i=1nVar(wi)Var(xi)=nVar(w)Var(x)Var(z) = \sum^n_{i=1} Var(w_i)Var(x_i) = nVar(w)Var(x)Var(z)=i=1n?Var(wi?)Var(xi?)=nVar(w)Var(x)
而我們希望線性變換不影響數據方差,因此有:
Var(z)=Var(x)Var(z)=Var(x)Var(z)=Var(x)
進一步可以算得:
Var(w)=1nVar(w) = \frac{1}{n}Var(w)=n1?
其中,n是上一層神經元的個數。需要注意的是,上式只考慮了正向傳播的情況,而實際在進行反向傳播時候,上述過程正好相反。反向傳播時z代表上一層神經元接收到的數據,而x則代表當前層傳出的數據,雖然計算公式不變,但n的含義卻發生了變化。為了進行區分,我們將正向傳播時的n、也就是代表上一層神經元個數的變量,命名為ninn_{in}nin?,而在進行反向傳播時的n、也就是代表當前層神經元個數的變量,命名為noutn_{out}nout?。為了同時兼顧向前傳播和反向傳播這兩種情況,我們將w的最終方差取值為:
Var(w)=1nin+nout2=2nin+noutVar(w) = \frac{1}{\frac{n_{in}+n_{out}}{2}} = \frac{2}{n_{in}+n_{out}}Var(w)=2nin?+nout??1?=nin?+nout?2?

取為均值,也就是折中的方案

而此時,如果我們設置w服從均勻在[-a, a]區間內均勻分布,則w的方差為:
Var(w)=(a+a)212=4a212=a23=2nin+noutVar(w) = \frac{(a+a)^2}{12} = \frac{4a^2}{12} = \frac{a^2}{3} = \frac{2}{n_{in}+n_{out}}Var(w)=12(a+a)2?=124a2?=3a2?=nin?+nout?2?

注:服從在[a, b]區間上均勻分布的隨機變量方差為(b?a)212\frac{(b-a)^2}{12}12(b?a)2?

進而計算可得
a=6nin+nouta = \sqrt{\frac{6}{n_{in}+n_{out}}}a=nin?+nout?6??

即w的是均勻分布在(?6nin+nout,6nin+nout)(-\sqrt{\frac{6}{n_{in}+n_{out}}}, \sqrt{\frac{6}{n_{in}+n_{out}}})(?nin?+nout?6??,nin?+nout?6??)上的隨機變量。

當然,如果我們假設w是服從正態分布的,則w服從(0,2nin+nout)(0, \sqrt{\frac{2}{n_{in}+n_{out}}})(0,nin?+nout?2??)的隨機變量。據此,我們就能設置每一層的初始參數了。當然,在PyTorch中,可以使用init方法進行初始化。

另外,一種更加嚴謹的、指代某一次傳播過程上一層神經元數量和下一層神經元數量的叫法是扇入(fan in)和扇出(fan out),由此Xavier方法中初始參數的方差也可寫為Var(w)=2fanin+fanoutVar(w) = \frac{2}{fan_{in}+fan_{out}}Var(w)=fanin?+fanout?2?。另外,Xavier在論文中所指出的,應該保持各層的激活值和梯度的方差在傳播過程中保持一致,也被稱為Glorot條件。

對于參數初始化計算過程,最重要的是確定參數的方差,如果是正態分布,由于均值是0,因此可以快速確定其分布,而如果是均勻分布,則可通過bound=3varbound = \sqrt{3var}bound=3var?來確定分布區間[?bound,bound][-bound, bound][?bound,bound]。而在Xavier初始化方法中,var=1fanavgvar = \frac{1}{fan_{avg}}var=fanavg?1? ,其中fanavg=fanin+fanout2fan_{avg} = \frac{fan_{in}+fan_{out}}{2}fanavg?=2fanin?+fanout??

最關鍵的,我們需要知道,對于創建隨機分布的初始參數來說,只要確定其方差,就能確定其均勻分布或者正態分布的分布形式。

2.Xavier初始化參數執行方法

2.1 PyTorch實現Xavier均勻分布的參數創建

我們可以使用torch.nn.init.xavier_uniform_進行初始化參數設置。

nn.init.xavier_uniform_? # Signature: nn.init.xavier_uniform_(tensor, gain=1.0) # Docstring: # Fills the input `Tensor` with values according to the method # described in `Understanding the difficulty of training deep feedforward # neural networks` - Glorot, X. & Bengio, Y. (2010), using a uniform # distribution. The resulting tensor will have values sampled from # :math:`\mathcal{U}(-a, a)` where# .. math:: # a = \text{gain} \times \sqrt{\frac{6}{\text{fan\_in} + \text{fan\_out}}}# Also known as Glorot initialization.# Args: # tensor: an n-dimensional `torch.Tensor` # gain: an optional scaling factor# Examples: # >>> w = torch.empty(3, 5) # >>> nn.init.xavier_uniform_(w, gain=nn.init.calculate_gain('relu')) # File: d:\users\asus\anaconda3\lib\site-packages\torch\nn\init.py # Type: function

當然,這里需要注意的是,函數處理的對象是張量,也就是說只要輸入張量,就可以自動進行處理。其中faninfan_{in}fanin?由張量的列決定,fanoutfan_{out}fanout?由張量的行數決定。(想想是為什么?)

從說明中我們能看到,此時均勻分布的邊界為a=gain×6fan_in+fan_outa = \text{gain} \times \sqrt{\frac{6}{\text{fan\_in} + \text{fan\_out}}}a=gain×fan_in+fan_out6??其中gain為增益系數,用于手動調整均勻分布的邊界,暫時不建議調整。

t = torch.arange(8).reshape(2, 4).float() t #tensor([[0., 1., 2., 3.], # [4., 5., 6., 7.]]) nn.init.xavier_uniform_(t) #tensor([[-0.2483, -0.8510, 0.0233, -0.9001], # [ 0.7834, -0.9809, 0.3314, 0.7942]]) t # 該函數會在原對象基礎上直接進行修改 #tensor([[-0.2483, -0.8510, 0.0233, -0.9001], # [ 0.7834, -0.9809, 0.3314, 0.7942]])
  • Sigmoid激活函數

??接下來,在建模過程中使用Xavier初始化方法測試效果。首先是數據準備與核心參數定義。

# 設置隨機數種子 torch.manual_seed(420) # 創建最高項為2的多項式回歸數據集 features, labels = tensorGenReg(w=[2, -1], bias=False, deg=2)# 進行數據集切分與加載 train_loader, test_loader = split_loader(features, labels)# 初始核心參數 lr = 0.03 num_epochs = 20

然后實例化模型、調整模型初始參數,以及創建用于對比模型效果的模型容器,首先我們先創建一組相對簡單的模型,也就是包含兩個sigmoid隱藏層的神經網絡模型,對比初始化效果

# 設置隨機數種子 torch.manual_seed(420) # 實例化模型 sigmoid_model3 = Sigmoid_class3() # 保留原參數 sigmoid_model3_init = Sigmoid_class3() # 使用Xavier初始化參數# 修改init模型初始參數 for m in sigmoid_model3_init.modules():if isinstance(m, nn.Linear):nn.init.xavier_uniform_(m.weight) #不用弄截距 #<torch._C.Generator at 0x284ef4d16b0> #Parameter containing: #tensor([[ 0.7995, -0.2561], # [-0.1097, -0.0529], # [-0.8137, 0.8860], # [-0.0984, 0.9770]], requires_grad=True) #Parameter containing: #tensor([[ 0.7130, 0.3764, -0.0196, -0.0096], # [ 0.0199, -0.8417, -0.2067, -0.4007], # [-0.0515, 0.1059, -0.6787, 0.6582], # [ 0.7072, 0.5386, 0.3889, 0.1370]], requires_grad=True) #Parameter containing: #tensor([[-0.6241, 0.3488, 0.3069, 0.8371], # [-0.8167, 0.7516, 0.6801, 0.1606], # [ 0.2885, 0.1036, -0.0692, 0.1744], # [ 0.5015, 0.0987, -0.0787, -0.0286]], requires_grad=True) #Parameter containing: #tensor([[-0.8437, -0.5244, 0.8917, 0.0646]], requires_grad=True)# 創建模型容器 model_l = [sigmoid_model3, sigmoid_model3_init] name_l = ['sigmoid_model3', 'sigmoid_model3_init']train_l, test_l = model_comparison(model_l = model_l, name_l = name_l, train_data = train_loader,test_data = test_loader,num_epochs = 2, criterion = nn.MSELoss(), optimizer = optim.SGD, lr = lr, cla = False, eva = mse_cal) weights_vp(sigmoid_model3, att="grad")

weights_vp(sigmoid_model3_init, att="grad")


我們發現,在num_epochs取值為2的時候(只迭代了一輪),經過Xavier初始化的模型梯度整體更加穩定,并且沒有出現梯度消失的情況,反觀原始模型sigmoid_model2,第一層的梯度已經非常小了,已經出現了梯度消失的傾向。而我們知道,各層梯度的情況就代表著模型學習的狀態,很明顯經過初始化的模型各層都處于平穩學習狀態,此時模型收斂速度較快。我們也可以通過MSE曲線進行驗證。

train_l, test_l = model_comparison(model_l = model_l, name_l = name_l, train_data = train_loader,test_data = test_loader,num_epochs = num_epochs, criterion = nn.MSELoss(), optimizer = optim.SGD, lr = lr, cla = False, eva = mse_cal) # 訓練誤差 for i, name in enumerate(name_l):plt.plot(list(range(num_epochs)), train_l[i], label=name) plt.legend(loc = 1) plt.title('mse_train')

# 測試誤差 for i, name in enumerate(name_l):plt.plot(list(range(num_epochs)), test_l[i], label=name) plt.legend(loc = 1) plt.title('mse_test')


??由此我們可知,Xavier初始化的作用核心在于保證各層梯度取值的平穩分布,從而確保各層模型學習的有效性,最終在模型結果的表現上,經過Xavier初始化參數的模型學習效率更高、收斂速度更快。上述結果也驗證了Xavier初始化有效性。
??當然,在一些極端情況下,Xavier初始化效果會更加明顯。我們以四層sigmoid隱藏層的神經網絡為例,觀察Xavier初始化在規避梯度消失問題時的效果。

# 設置隨機數種子 torch.manual_seed(24) # 實例化模型 sigmoid_model4 = Sigmoid_class4() # 保留原參數 sigmoid_model4_init = Sigmoid_class4() # 使用Xavier初始化參數# 修改init模型初始參數 for m in sigmoid_model4_init.modules():if isinstance(m, nn.Linear):nn.init.xavier_uniform_(m.weight) #<torch._C.Generator at 0x1a0c00f16b0> #Parameter containing: #tensor([[ 0.8858, 0.6076], # [ 0.7526, 0.3184], # [-0.2945, 0.9237], # [ 0.7596, -0.6387]], requires_grad=True) #Parameter containing: #tensor([[-0.0020, -0.2599, -0.8290, 0.0234], # [-0.5126, -0.1948, -0.2230, 0.7317], # [ 0.3355, -0.7767, 0.4933, 0.5650], # [ 0.3391, 0.3513, 0.3385, 0.0232]], requires_grad=True) #Parameter containing: #tensor([[-0.7911, -0.4265, 0.5541, 0.2841], # [ 0.6846, 0.2079, 0.8334, -0.3973], # [-0.4116, 0.3072, -0.4335, 0.3472], # [ 0.0940, -0.3414, 0.2058, 0.8155]], requires_grad=True) #Parameter containing: #tensor([[ 0.4660, -0.8182, 0.3571, 0.5147], # [ 0.6018, -0.2091, 0.7026, 0.6874], # [-0.0111, -0.1543, 0.6806, 0.1008], # [ 0.3697, 0.0858, 0.4200, -0.2422]], requires_grad=True) #Parameter containing: #tensor([[-0.6746, 0.9178, 0.5031, 0.2799]], requires_grad=True)# 訓練誤差# 創建模型容器 model_l = [sigmoid_model4, sigmoid_model4_init] name_l = ['sigmoid_model4', 'sigmoid_model4_init']# 核心參數 lr = 0.03 num_epochs = 40# 模型訓練 train_l, test_l = model_comparison(model_l = model_l, name_l = name_l, train_data = train_loader,test_data = test_loader,num_epochs = num_epochs, criterion = nn.MSELoss(), optimizer = optim.SGD, lr = lr, cla = False, eva = mse_cal) # 訓練誤差 for i, name in enumerate(name_l):plt.plot(list(range(num_epochs)), train_l[i], label=name) plt.legend(loc = 1) plt.title('mse_train')

# 測試誤差 for i, name in enumerate(name_l):plt.plot(list(range(num_epochs)), test_l[i], label=name) plt.legend(loc = 1) plt.title('mse_test')


sigmoid_model4是Lesson 13.2中出現嚴重梯度消失的模型,由于前幾層基本喪失學習能力,sigmoid_model4本身效果并不好。但加入Xavier初始化之后,我們發現,init模型能夠極大程度規避梯度消失問題,從而獲得更好的效果。

不過正如此前所說,相比于sigmoid激活函數,Xavier初始化方法更適用于tanh激活函數,核心原因在于tanh激活函數本身能夠生成Zero-centered Data,配合Xavier初始化生成的參數,能夠更好的確保各層梯度平穩、確保各層平穩學習。

  • tanh激活函數

我們以三層tanh激活函數隱藏層的神經網絡為例,測試Xavier初始化效果。

# 設置隨機數種子 torch.manual_seed(420) # 創建最高項為2的多項式回歸數據集 features, labels = tensorGenReg(w=[2, -1], bias=False, deg=2)# 進行數據集切分與加載 train_loader, test_loader = split_loader(features, labels) # 設置隨機數種子 torch.manual_seed(420) # 實例化模型 tanh_model3 = tanh_class3() # 保留原參數 tanh_model3_init = tanh_class3() # 使用Xavier初始化參數 # 設置隨機數種子 torch.manual_seed(420) # 修改init模型初始參數 for m in tanh_model3_init.modules():if isinstance(m, nn.Linear):nn.init.xavier_uniform_(m.weight) #<torch._C.Generator at 0x284ef4d16b0> #Parameter containing: #tensor([[ 0.6107, -0.6019], # [ 0.9517, -0.7944], # [-0.3051, -0.6891], # [ 0.7712, 0.3751]], requires_grad=True) #Parameter containing: #tensor([[-0.4319, -0.6698, -0.5014, -0.1671], # [-0.4420, 0.6311, -0.3644, -0.5666], # [-0.2672, -0.8457, -0.4206, -0.4725], # [ 0.1864, 0.7043, 0.0935, -0.5047]], requires_grad=True) #Parameter containing: #tensor([[ 0.3565, -0.3687, -0.4099, -0.1660], # [-0.4519, 0.0952, 0.7030, 0.1181], # [ 0.5231, -0.7523, -0.6813, -0.1152], # [ 0.0008, 0.5406, -0.7617, 0.3613]], requires_grad=True) #Parameter containing: #tensor([[-0.9402, 0.1767, 0.7240, 0.1511]], requires_grad=True)# 創建模型容器 model_l = [tanh_model3, tanh_model3_init] name_l = ['tanh_model3', 'tanh_model3_init']# 核心參數 lr = 0.03 num_epochs = 20# 模型訓練 train_l, test_l = model_comparison(model_l = model_l, name_l = name_l, train_data = train_loader,test_data = test_loader,num_epochs = 2, criterion = nn.MSELoss(), optimizer = optim.SGD, lr = lr, cla = False, eva = mse_cal) weights_vp(tanh_model3, att="grad")

weights_vp(tanh_model3_init, att="grad")


同樣,能夠看出經過Xavier參數初始化后的模型梯度更加平穩,進而我們判斷,經過初始化之后的模型初始迭代時收斂速度更快

# 設置隨機數種子 torch.manual_seed(420) # 實例化模型 tanh_model3 = tanh_class3() # 保留原參數 tanh_model3_init = tanh_class3() # 使用Xavier初始化參數# 修改init模型初始參數 for m in tanh_model3_init.modules():if isinstance(m, nn.Linear):nn.init.xavier_uniform_(m.weight) #<torch._C.Generator at 0x284ef4d16b0> #Parameter containing: #tensor([[ 0.7995, -0.2561], # [-0.1097, -0.0529], # [-0.8137, 0.8860], # [-0.0984, 0.9770]], requires_grad=True) #Parameter containing: #tensor([[ 0.7130, 0.3764, -0.0196, -0.0096], # [ 0.0199, -0.8417, -0.2067, -0.4007], # [-0.0515, 0.1059, -0.6787, 0.6582], # [ 0.7072, 0.5386, 0.3889, 0.1370]], requires_grad=True) #Parameter containing: #tensor([[-0.6241, 0.3488, 0.3069, 0.8371], # [-0.8167, 0.7516, 0.6801, 0.1606], # [ 0.2885, 0.1036, -0.0692, 0.1744], # [ 0.5015, 0.0987, -0.0787, -0.0286]], requires_grad=True) #Parameter containing: #tensor([[-0.8437, -0.5244, 0.8917, 0.0646]], requires_grad=True)# 創建模型容器 model_l = [tanh_model3, tanh_model3_init] name_l = ['tanh_model3', 'tanh_model3_init']# 核心參數 lr = 0.03 num_epochs = 40# 模型訓練 train_l, test_l = model_comparison(model_l = model_l, name_l = name_l, train_data = train_loader,test_data = test_loader,num_epochs = num_epochs, criterion = nn.MSELoss(), optimizer = optim.SGD, lr = lr, cla = False, eva = mse_cal)# 訓練誤差 for i, name in enumerate(name_l):plt.plot(list(range(num_epochs)), train_l[i], label=name) plt.legend(loc = 1) plt.title('mse_train')

# 測試誤差 for i, name in enumerate(name_l):plt.plot(list(range(num_epochs)), test_l[i], label=name) plt.legend(loc = 1) plt.title('mse_test')


同樣我們能夠發現,模型收斂速度更快,迭代多輪之后也變得更加穩定。

2.2 PyTorch實現Xavier高斯分布的參數創建

類似的,我們可以使用torch.nn.init.xavier_normal_進行初始化參數設置。

torch.nn.init.xavier_normal_? #Signature: torch.nn.init.xavier_normal_(tensor, gain=1.0) #Docstring: #Fills the input `Tensor` with values according to the method #described in `Understanding the difficulty of training deep feedforward #neural networks` - Glorot, X. & Bengio, Y. (2010), using a normal #distribution. The resulting tensor will have values sampled from #:math:`\mathcal{N}(0, \text{std}^2)` where # #.. math:: # \text{std} = \text{gain} \times \sqrt{\frac{2}{\text{fan\_in} + \text{fan\_out}}} # #Also known as Glorot initialization. # #Args: # tensor: an n-dimensional `torch.Tensor` # gain: an optional scaling factor # #Examples: # >>> w = torch.empty(3, 5) # >>> nn.init.xavier_normal_(w) #File: d:\users\asus\anaconda3\lib\site-packages\torch\nn\init.py #Type: function

std=gain×2fan_in+fan_out\text{std} = \text{gain} \times \sqrt{\frac{2}{\text{fan\_in} + \text{fan\_out}}}std=gain×fan_in+fan_out2??
當然,修改參數的方法也是相同的,例如:

# 實例化模型 sigmoid_model2 = Sigmoid_class2() # 修改init模型初始參數 for m in sigmoid_model2.modules():if isinstance(m, nn.Linear):nn.init.xavier_normal_(m.weight) # Parameter containing: # tensor([[-0.3229, -0.5913], # [ 0.2859, -0.0382], # [ 0.7426, -0.0482], # [-0.9737, -0.1796]], requires_grad=True) # Parameter containing: # tensor([[ 0.8277, 0.0731, -0.2164, -0.8359], # [-0.0992, 0.1425, -0.6378, -0.0512], # [-0.1305, 0.4111, 0.4144, 0.5496], # [ 0.8238, -0.3335, -0.4961, 0.5645]], requires_grad=True) # Parameter containing: # tensor([[-0.1274, 0.6312, 0.6152, -0.9861]], requires_grad=True)

其他測試初始化效果的相關實驗和此前操作流程一致,同學們可以自行進行嘗試。從理論上來說,均勻分布和高斯分布并沒有根本性區別,二者任選其一使用即可。不過也有一些不是很嚴謹的實驗證明了均勻分布比高斯分布能夠產生相對較大的梯度,因而模型學習效果會更好。

二、Kaiming方法(HE初始化)

1.HE初始化基礎理論

??盡管Xavier初始化能夠在Sigmoid和tanh激活函數疊加的神經網絡中起到一定的效果,但由于ReLU激活函數屬于非飽和類激活函數,并不會出現類似Sigmoid和tanh激活函數使用過程中可能存在的梯度消失或梯度爆炸問題,反而因為ReLU激活函數的不飽和特性,ReLU激活函數的疊加極有可能出現神經元活性消失的問題,很明顯,該類問題無法通過Xavier初始化解決。
??盡管如此,對參數的初始值進行合理設置,仍然是保證模型有效性的有效方法,同樣也能一定程度上解決ReLU激活函數的神經元活性消失問題。目前通用的針對ReLU激活函數的初始化參數方法,是由何凱明在2015年的《Delving Deep into Rectifiers:
Surpassing Human-Level Performance on ImageNet Classification》一文中所提出的HE初始化方法,也被稱為Kaiming方法。原文地址。

近一輪深度學習的興起也就在十年間,我們接觸到的很多算法和優化方法基本都是發表于10年內。

??當然,He初始化也遵循Glorot條件,即參數初始化結果要求正向傳播時各層接收到的數據方差保持一致、反向傳播時各層參數梯度的方差保持一致,不過由于每一層的激活值(激活函數輸出結果)均值不為0,因此Xavier的數學推導過程不再成立。關于HE初始化的數學推導此處不進行深入講解,感興趣的同學可自行參考論文中給出的推導過程。需要知道的是,經過一系列的推導和論證之后,HE初始化仍然是規定參數是滿足均值為0的隨機變量,并且仍然借助均勻分布和高斯分布進行隨機變量創建,不同的是Xavier中參數方差為:Var(w)Xavier=2fanin+fanoutVar(w)_{Xavier} = \frac{2}{fan_{in}+fan_{out}}Var(w)Xavier?=fanin?+fanout?2?而HE初始化過程中,參數方差為Var(w)HE=2fanin或Var(w)HE=2fanoutVar(w)_{HE} = \frac{2}{fan_{in}} 或 Var(w)_{HE} = \frac{2}{fan_{out}}Var(w)HE?=fanin?2?Var(w)HE?=fanout?2?也就是分子不變,分母取某層扇入或扇出的神經元的數量,同時論文中給出論證二者沒有明顯區別,建模過程中任取其一即可。

當然,根據參數方差,我們就能確定參數滿足均勻分布時的邊界,以及滿足高斯分布時的基本形態。均勻分布時bound=3varbound = \sqrt{3var}bound=3var?,因此參數分布區間為:(?6fanin,6fanin)(-\sqrt{\frac{6}{fan_{in}}}, \sqrt{\frac{6}{fan_{in}}})(?fanin?6??,fanin?6??)

值得注意的是,HE初始化不僅針對ReLU激活函數,還可以對其變種激活函數使用,相關內容會在后續進行介紹。

后續還將介紹其他初始化方法,我們仍然可以從以下幾個角度進行理解:
(1).為了滿足或者更好的滿足Glorot條件;
(2).數學理論推導出參數方差;
(3).方差由扇入和扇出神經元個數組成。

2.HE初始化在PyTorch中實現

2.1 PyTorch實現HE初始化的均勻分布參數創建

我們可以使用torch.nn.init.kaiming_uniform_進行初始化參數設置。

nn.init.kaiming_uniform_? #Signature: #nn.init.kaiming_uniform_( # tensor, # a=0, # mode='fan_in', # nonlinearity='leaky_relu', #) #Docstring: #Fills the input `Tensor` with values according to the method #described in `Delving deep into rectifiers: Surpassing human-level #performance on ImageNet classification` - He, K. et al. (2015), using a #uniform distribution. The resulting tensor will have values sampled from #:math:`\mathcal{U}(-\text{bound}, \text{bound})` where # #.. math:: # \text{bound} = \text{gain} \times \sqrt{\frac{3}{\text{fan\_mode}}} # #Also known as He initialization. # #Args: # tensor: an n-dimensional `torch.Tensor` # a: the negative slope of the rectifier used after this layer (only # used with ``'leaky_relu'``) # mode: either ``'fan_in'`` (default) or ``'fan_out'``. Choosing ``'fan_in'`` # preserves the magnitude of the variance of the weights in the # forward pass. Choosing ``'fan_out'`` preserves the magnitudes in the # backwards pass. # nonlinearity: the non-linear function (`nn.functional` name), # recommended to use only with ``'relu'`` or ``'leaky_relu'`` (default). # #Examples: # >>> w = torch.empty(3, 5) # >>> nn.init.kaiming_uniform_(w, mode='fan_in', nonlinearity='relu') #File: d:\users\asus\anaconda3\lib\site-packages\torch\nn\init.py #Type: function

相關參數解釋:

  • mode:參數表示選擇帶入扇入還是扇出的神經元個數進行計算,正如前文所說,理論上二者對建模沒有明顯影響,可任選其一,但實際由于模型個體差異,在實際使用過程中還是略有差異,我們可以根據實際效果進行選擇;
  • a:為使用ReLU變種激活函數時的修正系數;
  • nonlinearity:表示所選用的變種ReLU激活函數類型,需要配合a參數使用,相關使用方法我們將在后續介紹ReLU變種激活函數的使用時一并介紹。

另外,值得注意的是,kaiming方法的幫助文檔中的數學公式有誤,切勿參考該公式進行建模。

幫助文檔中公式bound=gain×3fan_mode\text{bound} = \text{gain} \times \sqrt{\frac{3}{\text{fan\_mode}}}bound=gain×fan_mode3??
而實際上kaiming方法并沒有gain增益系數,只有a的一個修正系數,實際公式如下:bound=6(1+a2)faninbound = \sqrt{\frac{6}{(1+a^2)fan_{in}}}bound=(1+a2)fanin?6??和Xavier方法一樣,kaiming方法直接對張量的值進行修改,并且張量列數表示faninfan_{in}fanin?的個數,行數表示fanoutfan_{out}fanout?的個數,據此,我們簡單測試下公式正確性。

t = torch.arange(12).reshape(2, 6).float() t #tensor([[ 0., 1., 2., 3., 4., 5.], # [ 6., 7., 8., 9., 10., 11.]]) # 設置隨機數種子 # torch.manual_seed(420) torch.nn.init.kaiming_uniform_(t) # 此時扇入個數是6 #tensor([[ 0.7759, -0.0605, 0.9326, -0.1187, -0.6536, 0.7461], # [ 0.6820, 0.5430, 0.1063, -0.6791, -0.6492, 0.3862]]) # 設置隨機數種子 # torch.manual_seed(420) torch.nn.init.kaiming_uniform_(t,a=1) # 此時分母是12 #tensor([[ 0.2317, 0.5822, 0.4021, -0.6404, -0.4904, -0.6925], # [ 0.3130, 0.6996, -0.6849, 0.5654, -0.6616, -0.0863]]) math.sqrt(0.5) #0.7071067811865476 t = torch.arange(18).reshape(6, 3).float() t #tensor([[ 0., 1., 2.], # [ 3., 4., 5.], # [ 6., 7., 8.], # [ 9., 10., 11.], # [12., 13., 14.], # [15., 16., 17.]]) # 設置隨機數種子 torch.manual_seed(420) torch.nn.init.kaiming_uniform_(t) # 此時扇入個數是3 #<torch._C.Generator at 0x225457416b0> #tensor([[ 0.8637, -0.8512, 1.3459], # [-1.1234, -0.4314, -0.9746], # [ 1.0907, 0.5305, -0.7054], # [-1.0938, -0.8188, -0.2728], # [-0.7218, 1.0306, -0.5950], # [-0.9252, -0.4363, -1.3810]]) math.sqrt(2) # 應該小于根號2 #1.4142135623730951

據此,驗證了公式的正確性。接下來,嘗試在建模過程中使用kaiming方法,驗證是否能夠加快迭代效率,并且規避神經元活性失效問題。

HE初始化如何幫助模型規避Dead ReLU Problem?核心在于模型初始化時如果參數完全隨機選擇,就有可能出現初始參數全部輸出0的結果,而通過HE初始化的參數不會出現上述情況。

# 設置隨機數種子 torch.manual_seed(420) # 創建最高項為2的多項式回歸數據集 features, labels = tensorGenReg(w=[2, 1], bias=False, deg=2)# 進行數據集切分與加載 train_loader, test_loader = split_loader(features, labels)# 初始核心參數 lr = 0.001 num_epochs = 20# 設置隨機數種子 torch.manual_seed(420) # 實例化模型 relu_model3 = ReLU_class3() # 保留原參數 relu_model3_init = ReLU_class3() # 使用HE初始化參數# 修改init模型初始參數 for m in relu_model3_init.modules():if isinstance(m, nn.Linear):nn.init.kaiming_uniform_(m.weight) #<torch._C.Generator at 0x225457416b0> #Parameter containing: #tensor([[ 1.3847, -0.4435], # [-0.1899, -0.0916], # [-1.4094, 1.5347], # [-0.1705, 1.6922]], requires_grad=True) #Parameter containing: #tensor([[ 1.0084, 0.5323, -0.0277, -0.0135], # [ 0.0282, -1.1904, -0.2923, -0.5667], # [-0.0729, 0.1498, -0.9598, 0.9308], # [ 1.0001, 0.7617, 0.5500, 0.1938]], requires_grad=True) #Parameter containing: #tensor([[-0.8826, 0.4933, 0.4340, 1.1838], # [-1.1550, 1.0630, 0.9618, 0.2271], # [ 0.4080, 0.1464, -0.0979, 0.2467], # [ 0.7092, 0.1396, -0.1113, -0.0405]], requires_grad=True) #Parameter containing: #tensor([[-0.9433, -0.5863, 0.9970, 0.0722]], requires_grad=True)# 創建模型容器 model_l = [relu_model3, relu_model3_init] name_l = ['relu_model3', 'relu_model3_init']train_l, test_l = model_comparison(model_l = model_l, name_l = name_l, train_data = train_loader,test_data = test_loader,num_epochs = num_epochs, criterion = nn.MSELoss(), optimizer = optim.SGD, lr = lr, cla = False, eva = mse_cal)# 訓練誤差 for i, name in enumerate(name_l):plt.plot(list(range(num_epochs)), train_l[i], label=name) plt.legend(loc = 1) plt.title('mse_train')

# 測試誤差 for i, name in enumerate(name_l):plt.plot(list(range(num_epochs)), test_l[i], label=name) plt.legend(loc = 1) plt.title('mse_test')


我們發現,使用HE初始化之后模型收斂速度明顯提升。

2.2 PyTorch實現HE初始化的正態分布參數創建

??類似的,我們可以使用torch.nn.init.kaiming_normal_來進行滿足正態分布的初始化參數設置。

nn.init.kaiming_normal_? #Signature: # nn.init.kaiming_normal_( # tensor, # a=0, # mode='fan_in', # nonlinearity='leaky_relu', # ) # Docstring: # Fills the input `Tensor` with values according to the method # described in `Delving deep into rectifiers: Surpassing human-level # performance on ImageNet classification` - He, K. et al. (2015), using a # normal distribution. The resulting tensor will have values sampled from # :math:`\mathcal{N}(0, \text{std}^2)` where# .. math:: # \text{std} = \frac{\text{gain}}{\sqrt{\text{fan\_mode}}}# Also known as He initialization.# Args: # tensor: an n-dimensional `torch.Tensor` # a: the negative slope of the rectifier used after this layer (only # used with ``'leaky_relu'``) # mode: either ``'fan_in'`` (default) or ``'fan_out'``. Choosing ``'fan_in'`` # preserves the magnitude of the variance of the weights in the # forward pass. Choosing ``'fan_out'`` preserves the magnitudes in the # backwards pass. # nonlinearity: the non-linear function (`nn.functional` name), # recommended to use only with ``'relu'`` or ``'leaky_relu'`` (default).# Examples: # >>> w = torch.empty(3, 5) # >>> nn.init.kaiming_normal_(w, mode='fan_out', nonlinearity='relu') # File: d:\users\asus\anaconda3\lib\site-packages\torch\nn\init.py # Type: function

同樣,說明文檔中的公式存在錯誤。以下是說明文檔中的公式:
std=gainfan_mode\text{std} = \frac{\text{gain}}{\sqrt{\text{fan\_mode}}}std=fan_mode?gain?實際上,PyTorch中所使用的HE初始化時,初始參數的方差為:Var(w)=2(1+a2)faninVar(w) = \frac{2}{(1+a^2)fan_{in}}Var(w)=(1+a2)fanin?2?
其中a為ReLU變種激活函數的修正系數,需要配合ReLU變種激活函數共同使用,扇入神經元個數和扇出神經元個數等效,并且std(w)=2(1+a2)faninstd(w) = \sqrt{\frac{2}{(1+a^2)fan_{in}}}std(w)=(1+a2)fanin?2??接下來,簡單實踐測試效果:

# 設置隨機數種子 torch.manual_seed(420) # 實例化模型 relu_model3 = ReLU_class3() # 保留原參數 relu_model3_init = ReLU_class3() # 使用HE初始化參數# 修改init模型初始參數 for m in relu_model3_init.modules():if isinstance(m, nn.Linear):nn.init.kaiming_normal_(m.weight) # <torch._C.Generator at 0x225457416b0> # Parameter containing: # tensor([[ 0.4132, 1.2154], # [-0.0425, -1.3647], # [-0.5896, 2.1108], # [ 0.2548, 0.1661]], requires_grad=True) # Parameter containing: # tensor([[ 0.5093, -0.2730, -0.1495, 1.4481], # [ 1.5209, 1.1812, 0.8868, -0.7768], # [ 0.6132, -0.8655, -0.3035, -0.1526], # [ 0.2752, -0.5203, -0.7091, -0.5119]], requires_grad=True) # Parameter containing: # tensor([[ 0.7865, -0.0605, 0.6548, -0.9418], # [-1.1811, 0.8337, 0.5161, -0.8076], # [ 0.6926, 0.9038, -0.4330, -0.1764], # [-0.4042, 0.3451, -0.5829, -0.0914]], requires_grad=True) # Parameter containing: # tensor([[-0.7091, 0.1566, -0.7193, -0.9234]], requires_grad=True) # 創建模型容器 model_l = [relu_model3, relu_model3_init] name_l = ['relu_model3', 'relu_model3_init']train_l, test_l = model_comparison(model_l = model_l, name_l = name_l, train_data = train_loader,test_data = test_loader,num_epochs = num_epochs, criterion = nn.MSELoss(), optimizer = optim.SGD, lr = lr, cla = False, eva = mse_cal) # 訓練誤差 for i, name in enumerate(name_l):plt.plot(list(range(num_epochs)), train_l[i], label=name) plt.legend(loc = 1) plt.title('mse_train')

# 測試誤差 for i, name in enumerate(name_l):plt.plot(list(range(num_epochs)), test_l[i], label=name) plt.legend(loc = 1) plt.title('mse_test')


同樣,經過HE初始化后的參數,模型收斂速度更快,也證明了HE初始化的有效性。

三、參數初始化的作用局限

??截止目前,我們討論了圍繞Glorot條件進行的參數初始化方法,當然,合理的設置初始參數值能夠一定程度上使得模型各層都得到有效的學習,模型訓練過程更加平穩、收斂速度也更快。但由于我們設置的是初始條件,伴隨著模型不斷訓練,由于受到激活函數導函數本身特性影響,仍然有可能在迭代過程中出現梯度不均衡的現象。
??然而模型一旦開始訓練,我們是不能手動參與修改模型參數的。那此時應該如何處理梯度不均衡的問題呢?我們知道,影響梯度計算的三個核心因素,分別是參數狀態值、激活值和輸入的數據,參數狀態值由模型迭代的數學過程決定,激活值很大程度上由我們所選取的激活函數決定,如果從Glorot條件入手,我們就只剩下一個可以人工修改的選項:每一個線性層接收到的數據。

總結

以上是生活随笔為你收集整理的Lesson 13.5 Xavier方法与kaiming方法(HE初始化)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日韩成人xxxx | 亚洲精品国产精品久久99热 | 99这里只有精品视频 | 91丨九色丨91啦蝌蚪老版 | 欧美国产精品久久久久久免费 | 精品国偷自产国产一区 | 97视频播放| 国产麻豆剧果冻传媒视频播放量 | 国产精品影音先锋 | 国产精品日韩欧美一区二区 | 国产在线精品视频 | 亚洲永久精品国产 | 伊人五月天婷婷 | 久久影视精品 | 国产精品久久久久久妇 | 国产手机在线观看 | 亚洲国产字幕 | 麻豆国产精品视频 | 久久国内精品99久久6app | 999视频在线播放 | 国产日本亚洲高清 | 99精品国产兔费观看久久99 | 亚洲狠狠丁香婷婷综合久久久 | 国产高清久久 | 精品久久久成人 | 国产视频在线播放 | 国偷自产中文字幕亚洲手机在线 | 日韩欧美在线观看一区 | 在线小视频国产 | av免费看在线| 少妇激情久久 | 日日操夜夜操狠狠操 | 91精品一区二区三区久久久久久 | 国产精品久久久久久久久久久久午夜 | 国际精品久久久久 | www.天天色.com| 五月天激情视频在线观看 | 91麻豆精品91久久久久同性 | 日韩动态视频 | 久久国产精品久久精品 | 国产中文字幕在线 | 国产成人精品一区二区在线观看 | 欧美激情视频一区二区三区免费 | 国产精品原创av片国产免费 | 日韩在线中文字幕视频 | 久久久久在线观看 | 欧美在线视频免费 | 九九九九热精品免费视频点播观看 | 国产亚洲精品久久久久久网站 | 综合色在线观看 | 久久亚洲免费视频 | 懂色av一区二区三区蜜臀 | 91九色在线观看视频 | 亚洲精品国产自产拍在线观看 | 色久综合 | 伊人狠狠色丁香婷婷综合 | 中文字幕一区二区三区在线视频 | 91中文在线观看 | 欧美黑吊大战白妞欧美 | 欧美一二三在线 | 国产在线国偷精品产拍免费yy | 国产尤物视频在线 | 欧美激情综合五月色丁香 | 91av亚洲| 国产美腿白丝袜足在线av | 色综合天天天天做夜夜夜夜做 | 免费黄在线观看 | 免费在线观看一区 | 美女视频黄频大全免费 | 在线播放国产精品 | 久久久久久高清 | 国产精品久久久久久久久久免费 | 深夜精品福利 | 欧美色精品天天在线观看视频 | 97在线观看免费视频 | 欧美一区二区伦理片 | 国产视频一区精品 | 国产精品黄色 | 日韩美一区二区三区 | 久久99精品国产麻豆宅宅 | 久久影院中文字幕 | 天天综合色网 | 亚洲一区久久 | 日韩av一区二区三区 | 91麻豆精品国产91久久久无限制版 | 欧美日韩不卡一区二区三区 | 一区视频在线 | 黄色影院在线播放 | 国产资源在线视频 | 在线天堂中文在线资源网 | 天天操伊人 | 日日干日日操 | 亚洲jizzjizz日本少妇 | av免费在线网站 | 97精品免费视频 | 中文字幕一区在线 | 国产韩国日本高清视频 | 黄色免费观看视频 | 成年人免费在线观看网站 | 亚洲,国产成人av | 亚洲视频国产 | 伊人久在线 | 国产成人黄色片 | 99国产在线视频 | 免费视频 你懂的 | 成人av在线一区二区 | 久久久久伦理电影 | 免费在线一区二区三区 | 伊人狠狠操 | 麻豆一区二区三区视频 | 国产又粗又硬又长又爽的视频 | av线上看| av女优中文字幕在线观看 | av福利在线导航 | 亚洲精区二区三区四区麻豆 | 天天插天天操天天干 | 激情网站网址 | 在线观看黄色大片 | 久久国产精品网站 | 丁香六月天婷婷 | 999久久久欧美日韩黑人 | 精品一区二区在线免费观看 | 视频在线观看99 | 色婷久久 | 天天操天天干天天 | 免费在线观看av的网站 | 欧美一级性视频 | 一区二区视 | 激情视频网页 | 日本黄色免费在线 | 国产在线色站 | 久久久久国产一区二区 | 色婷婷88av视频一二三区 | 亚洲精品国产精品国自产在线 | 国产午夜精品久久久久久久久久 | 天天色天天干天天 | 在线观看www91 | 国产高清视频在线 | 九九九免费视频 | 福利视频一区二区 | www.日日操.com| 天天操夜操视频 | 天堂av在线中文在线 | 永久免费av在线播放 | 日韩欧美国产免费播放 | 黄色91在线观看 | 国产精品123| 香蕉免费 | 成人在线视频免费 | 波多野结衣在线视频免费观看 | 国产手机视频在线观看 | 在线观看福利网站 | 久久久精品视频成人 | 成人av观看| 欧亚久久 | 国产一区欧美二区 | 久草精品视频在线看网站免费 | 免费视频a | 午夜精品一区二区三区可下载 | 午夜精品久久久久久99热明星 | 99久久网站 | 国产精品日韩久久久久 | 亚洲精品一区二区三区在线观看 | 福利视频区 | 亚洲精品视频第一页 | av大全在线免费观看 | 中文字幕永久免费 | 欧美婷婷色 | 美女视频黄频大全免费 | 69视频在线 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 国产亚洲精品久久 | 亚洲午夜电影网 | 国产一级在线视频 | 日韩成人不卡 | 日本公妇色中文字幕 | 欧美成人按摩 | 成人免费大片黄在线播放 | 亚洲午夜电影网 | 国产精品网站 | 色婷婷激情电影 | 不卡在线一区 | 国产视频一区在线免费观看 | 国产精品18久久久久久久网站 | 日本丰满少妇免费一区 | 午夜精品电影 | 久99久精品视频免费观看 | 天天射天天干 | 美女黄网站视频免费 | 日韩在线视频一区 | 国产精品久久久久久久久久99 | 免费人成在线观看网站 | 96香蕉视频| 99视频精品在线 | 成人在线播放免费观看 | 久久午夜精品影院一区 | 国产在线视频一区二区三区 | 国产精品99久久久久久久久久久久 | 国产一二区免费视频 | 日韩视频 一区 | 国产女人40精品一区毛片视频 | 久久久人 | 在线观看免费观看在线91 | 天天干天天看 | 国产精品伦一区二区三区视频 | 91九色老 | 国产精品国产三级国产aⅴ9色 | 久久精品国产精品亚洲精品 | 国产91精品一区二区麻豆网站 | 久久久久久久久影视 | 在线观看黄色的网站 | 波多野结衣精品视频 | 国产精品毛片网 | 五月宗合网 | 天天操天天舔天天干 | 国产麻豆果冻传媒在线观看 | 亚洲黄色大片 | 亚洲免费公开视频 | 在线视频观看你懂的 | 婷婷www| 日韩系列在线观看 | 久久国产系列 | 免费亚洲视频在线观看 | 91一区啪爱嗯打偷拍欧美 | 国产3p视频 | 国产精彩在线视频 | 国产99久久久精品 | 国产精品系列在线观看 | 国产精品入口传媒 | 免费h精品视频在线播放 | 99视频在线免费播放 | 男女拍拍免费视频 | 91人人网| 亚洲伊人av | 手机看片中文字幕 | 在线影院 国内精品 | 日日婷婷夜日日天干 | 午夜精品电影 | 九九影视理伦片 | 国产精品成人自产拍在线观看 | 亚洲人片在线观看 | 精品国产一区二区久久 | 日日弄天天弄美女bbbb | 久久精品这里热有精品 | 黄色毛片在线看 | 亚洲精品福利在线 | 国产精品免费久久 | 91av播放| 亚洲一级电影 | 中文字幕有码在线播放 | 国产午夜精品一区二区三区四区 | 三级黄色a | 中文字幕国产 | 美女福利视频网 | 欧美一级性生活 | 日本精品视频在线观看 | 成人影视片 | 国产精品麻豆一区二区三区 | 深夜免费小视频 | 天堂素人在线 | 丁香六月婷婷开心 | 在线看一级片 | 久久综合久久鬼 | 日韩免费视频播放 | 免费日韩 精品中文字幕视频在线 | 精品视频区 | 国产123区在线观看 国产精品麻豆91 | 国产精品白虎 | av中文字幕在线观看网站 | 午夜在线观看影院 | 一区三区在线欧 | 免费av小说 | 久久精品国产精品亚洲精品 | 不卡的av中文字幕 | 狠狠躁夜夜a产精品视频 | 日本中文字幕在线观看 | 麻豆91在线| 国内精品久久久久久久久久 | 91精品国产综合久久福利不卡 | 亚洲三级在线播放 | 色婷丁香 | 日韩欧美成人网 | 国产精品av在线免费观看 | 久久网站免费 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 精品国产诱惑 | 日韩av一区在线观看 | 草久草久 | 欧美精品久久久久久久久久白贞 | 国产精品video爽爽爽爽 | 国产日韩在线播放 | 欧美 日韩 国产 中文字幕 | 国产高清免费在线观看 | av女优中文字幕在线观看 | 国产精品视频在线看 | 九色91视频| 成在人线av| 91禁在线看 | 91在线免费观看网站 | 五月婷婷综合在线观看 | 热久久电影 | 亚洲欧美日本国产 | 六月天综合网 | 2019天天干天天色 | 久久精品99久久久久久 | 国模精品一区二区三区 | 天天草网站| 永久免费毛片在线观看 | 国产国语在线 | 黄色软件在线观看视频 | 亚洲午夜精品久久久久久久久久久久 | 91色网址| 午夜电影一区 | 中文字幕在线字幕中文 | 久久精品三级 | 久久99精品一区二区三区三区 | 99热网站| 九九九九精品九九九九 | 国产亚州精品视频 | 综合久久网 | 国产精品成人久久久久久久 | 麻豆观看 | 2019久久精品 | 在线亚洲免费视频 | 久久激情网站 | 久久草草影视免费网 | 五月激情天 | 国产破处在线视频 | 最近日本中文字幕 | 91视频啪 | 黄色成人在线 | 日韩在线首页 | 97超碰在线久草超碰在线观看 | 亚洲成av人电影 | 丁香 婷婷 激情 | 91pony九色丨交换 | 亚洲国产精品99久久久久久久久 | av在线一二三区 | 亚洲精品一区二区在线观看 | 久久久久久久久久久久久久免费看 | 最近中文字幕国语免费高清6 | 国产又粗又猛又黄 | 99久久婷婷国产综合精品 | 91 中文字幕 | 在线精品视频在线观看高清 | 一区二区三区 亚洲 | 99爱视频| 黄色官网在线观看 | 一区二区三区日韩在线观看 | 国产九色视频在线观看 | 99九九视频 | 伊人电影天堂 | 久精品在线 | 国产一区成人 | 江苏妇搡bbbb搡bbbb | 中文字幕免费高清 | 免费观看一区二区三区视频 | 日本公妇在线观看高清 | 国产不卡免费av | 色婷婷综合久久久 | 天天综合久久综合 | a黄色一级| 激情av五月婷婷 | 欧美在线视频二区 | 日韩精品欧美视频 | 国产一区在线视频 | 久久女教师 | 久久99精品国产99久久 | 久久久免费国产 | 91精品视频一区 | 国产999精品久久久 免费a网站 | 国产精品亚洲精品 | 四虎影视精品 | 色天天中文 | 中文在线a∨在线 | 欧美小视频在线观看 | 网站你懂的 | 在线观看中文字幕 | 国产精品视频久久久 | 亚洲激精日韩激精欧美精品 | 91 在线视频播放 | 国产一二三区在线观看 | 国产亚洲字幕 | 91久久爱热色涩涩 | 91精品国产91久久久久久三级 | 月下香电影| 最近免费中文字幕 | 日韩xxxbbb| 天天操,夜夜操 | 99精品视频在线播放观看 | 日韩av综合网站 | 欧美成人在线免费观看 | 狠狠狠干| 亚洲精品久久久蜜桃直播 | 精品在线一区二区 | 久久综合五月天 | 色香蕉视频| 亚洲一级理论片 | 五月天婷亚洲天综合网鲁鲁鲁 | 成人av在线一区二区 | 久久亚洲国产精品 | 伊人婷婷综合 | 99精品国产免费久久久久久下载 | 国产又粗又猛又黄又爽的视频 | 国产黄免费看 | 久热这里有精品 | 97视频免费在线 | 97操碰 | 色噜噜噜噜 | 成年人免费在线播放 | 91网址在线看 | 91av欧美 | 热久在线 | 国产成人亚洲在线观看 | 久久这里只有精品视频首页 | 久久伊人综合 | 婷婷亚洲五月色综合 | 色天天综合久久久久综合片 | 在线观看91视频 | 黄色网www| 久久精品直播 | 六月丁香激情综合色啪小说 | 99精品视频中文字幕 | 五月综合色 | 九九九九九国产 | 国产又粗又猛又色又黄视频 | 中文字幕一区二 | 国产黄色看片 | 伊人成人久久 | 久久久免费精品视频 | 中文字幕一区二区在线播放 | 久草在线在线精品观看 | 国产麻豆视频在线观看 | 精品一二区 | 日韩精品免费一区二区在线观看 | 国产又黄又硬又爽 | 99精品视频在线播放观看 | 久久精品一区二区三区四区 | 久综合网 | 91大神精品视频在线观看 | 免费高清在线观看电视网站 | 综合在线色 | 国产一区二区影院 | 99色亚洲 | 在线观看黄av | 天天操天天操天天操天天操 | 欧美污网站 | 午夜免费久久看 | 欧产日产国产69 | 国产精品一区一区三区 | 久久色中文字幕 | 免费碰碰 | 国产成人精品在线播放 | 四虎国产精品成人免费影视 | 国产精品资源网 | 久草视频99 | 在线观看免费91 | 亚洲精品在线视频观看 | 免费麻豆网站 | 国产 日韩 欧美 自拍 | 嫩草av在线 | 高清精品在线 | www激情com | 国产视频亚洲视频 | 深爱激情亚洲 | 亚洲人久久 | 啪啪午夜免费 | 婷婷视频在线播放 | 91精品视频免费观看 | 黄色小说在线免费观看 | 黄色一级在线视频 | 国产精品v a免费视频 | 欧美另类xxxxx | 日韩有码第一页 | 欧美成人精品xxx | 国产成人免费av电影 | 久久99国产一区二区三区 | 91丨九色丨蝌蚪丨老版 | 在线观看视频日韩 | 午夜av不卡 | 草免费视频 | 精品一区二区三区香蕉蜜桃 | 久草网在线视频 | 久久 在线 | 韩国在线视频一区 | 丁香5月婷婷久久 | 成人黄大片 | 五月婷婷av在线 | 欧美日韩国产色综合一二三四 | 91精品天码美女少妇 | 国产女v资源在线观看 | 久久综合久色欧美综合狠狠 | 高清免费在线视频 | 国产中文字幕在线视频 | 综合在线观看色 | 在线免费观看黄色 | 午夜av大片| 国内久久看| 中文字幕 国产视频 | 349k.cc看片app| 国内精品毛片 | 激情电影影院 | 欧美日韩在线观看一区 | 国产又粗又硬又爽视频 | 国产精品美女网站 | 天天射天天色天天干 | 久久久麻豆视频 | 日本黄色免费观看 | 成人亚洲综合 | 日韩一级网站 | 久久天天操| 久久麻豆精品 | 91在线免费观看网站 | www,黄视频 | 久久精品国产亚洲精品 | 超碰av在线免费观看 | 一区二区三区日韩精品 | 婷婷丁香狠狠爱 | 美女免费黄网站 | 丁香六月婷 | 亚州国产精品 | 天天综合色 | 久草在线看片 | 久草在线高清视频 | www.国产精品 | 五月天婷婷在线视频 | 日操操| 日本久久高清视频 | 久久国产露脸精品国产 | 国产精品久久久久久久久久妇女 | 狠狠久久伊人 | 国产精品中文在线 | 午夜精品福利在线 | 久久99精品久久久久久三级 | 国产一区二区在线免费观看 | 国产精品久久久777 成人手机在线视频 | 亚洲精品成人免费 | a午夜在线| 欧美午夜性生活 | 久久久久在线观看 | 狠狠色综合网站久久久久久久 | 欧美在线视频二区 | 日韩激情在线视频 | 高清不卡一区二区三区 | www亚洲视频 | 四虎影视8848aamm| 欧美精品在线观看免费 | 国产91在线观看 | 久久久精品小视频 | 96精品在线| 欧美亚洲国产精品久久高清浪潮 | 97看片网 | 亚洲首页 | 特级西西www44高清大胆图片 | 综合久久2023 | 日本午夜在线亚洲.国产 | 久草爱视频 | 国产亚洲精品美女 | 久草视频免费看 | 久久超碰在线 | 日韩在线播放欧美字幕 | 色播99 | 色偷偷网站视频 | a级成人毛片 | 成人91av| 久久久国产成人 | 婷婷草 | 好看的国产精品视频 | 东方av在| 国产精品av免费 | 欧美精品在线视频观看 | 中文在线a∨在线 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 日韩欧美在线中文字幕 | 久久综合色天天久久综合图片 | 天天鲁天天干天天射 | 成人黄色小视频 | 国产精品美女久久久久久久网站 | 日本中出在线观看 | 黄色影院在线观看 | 亚洲年轻女教师毛茸茸 | 久久人人插 | 欧美成年网站 | 久久综合影音 | 国产免费视频一区二区裸体 | 日韩久久久久久 | 日韩一级黄色大片 | 激情网五月 | 日韩免费一级a毛片在线播放一级 | 国产亚洲91 | 精品国产免费观看 | 亚州精品在线视频 | av中文字幕不卡 | 三级黄色免费 | 久久免费看a级毛毛片 | 欧美日韩在线精品一区二区 | 欧美另类色图 | 久久福利综合 | 国产中文欧美日韩在线 | 99视频黄| 在线超碰av| 色噜噜在线观看 | 亚洲免费专区 | 亚洲专区中文字幕 | 伊色综合久久之综合久久 | 婷婷丁香色 | 久久五月婷婷丁香社区 | 日韩在线一区二区免费 | 免费观看成人网 | 国产成人精品国内自产拍免费看 | 手机成人av | 国产成人久久精品77777综合 | 久久久国产精品电影 | 久久av一区二区三区亚洲 | 日韩a在线 | 丁香六月久久综合狠狠色 | 美女黄濒 | 亚洲综合国产精品 | 波多野结衣动态图 | 色网免费观看 | 色婷婷亚洲精品 | 四虎永久网站 | 成年人免费看片网站 | 91香蕉视频色版 | 亚洲午夜在线视频 | 欧美在线18| 久久久久免费观看 | 中文乱幕日产无线码1区 | 婷婷国产在线 | 国产精品理论片在线观看 | 日韩在线理论 | 九九九热精品免费视频观看 | 91精品在线免费观看 | 日日干夜夜草 | 日韩欧美综合在线视频 | av在线h| 激情校园亚洲 | 国产999精品久久久 免费a网站 | 欧美小视频在线观看 | 毛片基地黄久久久久久天堂 | 伊人五月 | 日韩色综合| 日韩高清三区 | 综合久久久久久久久 | 91在线公开视频 | 国内精品久久久久久 | 久久天天拍 | 中文字幕日韩一区二区三区不卡 | 黄色不卡av| 黄色avwww| 亚洲va在线va天堂 | 18av在线视频 | 婷婷色中文字幕 | 成人欧美一区二区三区黑人麻豆 | 亚洲狠狠干 | 久久亚洲在线 | 亚洲精品中文在线资源 | 成年人在线免费看片 | 91欧美视频网站 | 欧美与欧洲交xxxx免费观看 | 亚洲区视频在线观看 | 精品国产福利在线 | 九九视频在线播放 | 欧美日韩免费看 | 久久久久成人免费 | 国产精品麻豆三级一区视频 | 国产精品久免费的黄网站 | 婷婷深爱| www.av免费观看 | 在线不卡视频 | 日韩免费看 | 欧美一区三区四区 | 久久天天躁狠狠躁亚洲综合公司 | 国产日韩欧美在线免费观看 | 精品亚洲国产视频 | a在线免费观看视频 | 久久精品一区二区三区中文字幕 | 亚洲成免费 | 成人在线免费看视频 | 成人欧美一区二区三区在线观看 | 婷婷五月在线视频 | 国产精品免费一区二区 | 日韩高清av在线 | 亚洲资源在线 | 中文字幕亚洲欧美日韩2019 | 黄色片网站免费 | 99久久精品免费看国产 | 色夜影院| 成人免费毛片aaaaaa片 | 国产精彩视频一区二区 | 久艹视频免费观看 | 国产精品丝袜久久久久久久不卡 | 免费观看9x视频网站在线观看 | 亚洲国产精品va在线看黑人 | 亚洲一区二区精品在线 | 一区二区三区免费播放 | 久久草网站 | 三级av网站 | 午夜久久网 | 免费日韩在线 | 精品久久网站 | 91精品一区二区三区蜜桃 | 国产91探花 | 在线观看色网站 | 永久黄网站色视频免费观看w | 在线 视频 亚洲 | 色黄www小说| 欧美人牲 | 天天色天天操综合网 | 国产精品免费久久久久久久久久中文 | 91麻豆视频| 91免费版成人 | 国产高清专区 | 欧美亚洲专区 | 天天色宗合 | 81国产精品久久久久久久久久 | 黄污网站在线观看 | 六月丁香激情综合色啪小说 | 国产99久久久久 | 人人玩人人添人人澡97 | 国产精品永久在线观看 | 成人av高清在线观看 | 亚洲精品乱码白浆高清久久久久久 | 国产日产精品一区二区三区四区的观看方式 | 国产精品视频全国免费观看 | 不卡电影一区二区三区 | 996久久国产精品线观看 | 国产亚洲成人精品 | 久久久久国产成人免费精品免费 | 欧美日韩国产二区 | 四虎影院在线观看av | 中文字幕 第二区 | 久久久久久久久久久久亚洲 | 91九色网址| 国产成人无码AⅤ片在线观 日韩av不卡在线 | 西西44人体做爰大胆视频 | 五月婷婷丁香激情 | 亚洲国产精品传媒在线观看 | 国产精品18久久久久久首页狼 | 久久久久久久久久久久国产精品 | 久久精品亚洲 | 亚洲区另类春色综合小说校园片 | 日日干美女 | 日韩电影中文,亚洲精品乱码 | 亚洲精品高清视频 | 成人污视频在线观看 | 玖玖在线视频观看 | 国产精久久久久久妇女av | 91av免费在线观看 | 人九九精品 | 国产精久久久 | 美女久久精品 | 日日夜夜精品视频 | 日韩精品中文字幕有码 | 一区二区在线影院 | www.夜夜爱 | 久久久香蕉视频 | 91探花国产综合在线精品 | 狠狠躁日日躁狂躁夜夜躁 | 欧美日韩中文在线 | 国产一区二区不卡视频 | 国产精品私人影院 | 国产精品永久 | 在线视频福利 | 日本mv大片欧洲mv大片 | 麻豆精品国产传媒 | 久久久久免费精品国产 | 日韩理论电影在线 | av在观看 | 欧美一级高清片 | 日韩欧美电影 | 国产精品电影一区二区 | av线上免费看| 婷婷中文在线 | 欧美日韩国产一区二区在线观看 | 又污又黄的网站 | 国产精品 9999| 亚州视频在线 | 久久久男人的天堂 | h动漫中文字幕 | 久久久久久免费视频 | 狠狠躁夜夜躁人人爽视频 | 久久电影国产免费久久电影 | 国产日韩欧美自拍 | 成片免费观看视频 | 欧美 日韩 国产 成人 在线 | www免费网站在线观看 | 三上悠亚一区二区在线观看 | 国产亚洲精品久久 | 国产精品一区二区62 | 欧美色噜噜噜 | 又爽又黄又无遮挡网站动态图 | 国产精品刺激对白麻豆99 | 国产精品国产自产拍高清av | 日韩免费观看av | 日韩理论电影在线 | 国内外激情视频 | 日日干狠狠操 | 久久视频免费 | 日韩电影一区二区在线观看 | 最近中文字幕视频网 | 免费黄色a网站 | 亚洲国产精品va在线 | 成人午夜性影院 | 成人精品电影 | 91综合色| 99久久网站 | 亚洲国产69 | 亚洲天天综合网 | 天天躁日日躁狠狠躁av麻豆 | 在线观看日本韩国电影 | 日韩高清在线看 | 日韩中文字幕亚洲一区二区va在线 | 色婷婷九月 | 黄污视频网站大全 | 黄色免费大全 | 国际精品网 | 99免费在线播放99久久免费 | 国产亚洲精品美女久久 | 免费十分钟 | 亚洲一级二级 | 国产精品不卡视频 | 中文字幕在线国产 | 亚洲蜜桃av | 久久公开免费视频 | 国产分类视频 | 人人搞人人爽 | 久久久久在线观看 | 欧美精品一区二区三区四区在线 | 97色免费视频 | 精品伦理一区二区三区 | 国产激情电影综合在线看 | av电影中文字幕 | 久久久影院一区二区三区 | 一级一级一片免费 | 久草在线视频首页 | 成人久久精品视频 | 91视频91蝌蚪 | 九九免费精品视频 | 在线免费观看不卡av | 欧美精品免费在线 | 天天操天 | 日韩在线观看一区二区 | 久久人网 | 久久久国产一区二区 | 精品久久久久免费极品大片 | 国产青草视频在线观看 | 福利久久久| 国产精品 视频 | 中文字幕在线资源 | 欧美先锋影音 | 国产精品久久综合 | 手机在线看a | av网址最新 | 成人av网站在线播放 | 色狠狠综合 | 亚洲精品在线资源 | 中文字幕在线播放一区二区 | 日韩视频免费播放 | 91日韩在线 | 久久国产成人午夜av影院潦草 | 99久久久国产精品美女 | 99在线视频播放 | 人人爱爱 | 在线观看黄色的网站 | 黄色三级视频片 | 一区视频在线 | 婷婷六月天丁香 | 欧美在一区 | 在线看片中文字幕 | 国产亚洲高清视频 | 在线精品在线 | 九色精品免费永久在线 | 午夜 在线 | 婷婷成人综合 | 久青草影院 | 成人在线观看影院 | 国产精品欧美日韩在线观看 | 国产精品 中文字幕 亚洲 欧美 | av不卡中文 | 成人免费视频网站在线观看 | 欧美精品小视频 | 中文字幕一区二区三区四区 | 欧美日韩另类在线 | 色综合久久综合 | 中文字幕一区2区3区 | 久久精品在线 | 激情图片qvod | 国产精品久久久久永久免费 | 中文一区二区三区在线观看 | 亚洲dvd | www.在线观看视频 | 亚洲精品视频在线看 | 免费亚洲婷婷 | 国产色视频123区 | 天天干夜夜夜 | 一区二区三区在线不卡 | 青青河边草免费直播 | 人人草人人草 | 成人啊 v| 国产中文字幕在线免费观看 | 久久久久久久网站 | 视频在线观看入口黄最新永久免费国产 | 婷婷伊人五月天 | 91看片淫黄大片一级在线观看 | 麻豆久久精品 | 国产高清精 | 在线免费精品视频 | 911香蕉视频| 久久亚洲电影 | 国产午夜不卡 | 久久视频这里有久久精品视频11 | 亚洲精品女人久久久 | 81国产精品久久久久久久久久 | 国产精品中文字幕在线观看 | 麻豆视频免费入口 | 国产精品系列在线播放 | 中文字幕精品一区二区精品 | 一级成人免费视频 | 亚洲最大av网站 | 国产精品视频地址 | 久久a v视频 | 在线 精品 国产 | 欧美日韩中文字幕在线视频 | 在线观看日本高清mv视频 | 国产品久精国精产拍 | 亚洲午夜精品电影 | 91色影院 | 午夜视频在线网站 | 久久视频免费 | 亚洲最新合集 | 西西人体www444 | 欧美污网站 | 美女在线免费视频 | 中文字幕无吗 | 日韩精品中文字幕在线播放 | 成人avav | 精品福利在线视频 | 免费观看国产成人 | 一区二区三区四区五区在线 | a级黄色片视频 | 日本视频精品 | 亚洲视频在线免费看 | 免费在线激情电影 | 国产成人免费在线 | 夜夜嗨av色一区二区不卡 | 日本资源中文字幕在线 | 免费看成人片 | 东方av免费在线观看 | 麻豆一区在线观看 | 色综合亚洲精品激情狠狠 | 伊人婷婷综合 | 免费视频成人 | 在线视频91 | 午夜av电影 | 国产伦理精品一区二区 | 操一草 | 丁香五香天综合情 | 成人在线播放av | 亚洲v欧美v国产v在线观看 | 天天爽天天做 | 五月婷香 | 免费日韩 精品中文字幕视频在线 | 亚洲精品午夜久久久 | 最近高清中文在线字幕在线观看 | 欧洲黄色片 | 成人一区电影 | 久久久久久久久久免费 | 成人亚洲精品国产www | 国产黄色电影 | 国产高清在线免费 | 欧美日韩国产高清视频 | av资源网在线播放 | 免费久久网 | 99在线精品视频在线观看 | 色综合天天视频在线观看 | 色在线免费 | 美女在线观看av | 亚洲综合在线播放 | 日韩高清毛片 | 日韩精品一区二区三区丰满 | 亚洲激情五月 | 久久美女电影 | 日韩精品免费一区二区三区 | a成人v | 91成人免费电影 | 久久久久久久久毛片精品 | 天堂资源在线观看视频 | 日本久久电影网 | av永久网址 | 操操日 | 亚洲在线色 | 亚洲精品乱码久久久久久久久久 | 丁香色婷婷 | 国产精品久久久久一区二区三区共 | 18国产精品白浆在线观看免费 | 久久69精品久久久久久久电影好 | 九九在线视频 |