AI-02a5a5.神經網絡-與學習相關的技巧-權重初始值

權重的初始值

在神經網絡的學習中,權重的初始值特別重要。實際上,設定什么樣的權重初始值,經常關系到神經網絡的學習能否成功。

不要將權重初始值設為 0

權值衰減(weight decay):抑制過擬合、提高泛化能力的技巧。

如果想減小權重的值,一開始就將初始值設為較小的值才是正途。

將權重初始值設為0的話,將無法正確進行學習。為什么呢?
在誤差反向傳播法中,所有的權重值都會進行相同的更新。比如,在2層神經網絡中,假設第1層和第2層的權重為0。這樣一來,正向傳播時,因為輸入層的權重為0,所以第2層的神經元全部會被傳遞相同的值。第2層的神經元中全部輸入相同的值,這意味著反向傳播時第2層的權重全部都會進行相同的更新。因此,權重被更新為相同的值,并擁有了對稱的值(重復的值)。這使得神經網絡擁有許多不同的權重的意義喪失了。為了防止“權重均一化”(瓦解權重的對稱結構),必須隨機生成初始值。

隱藏層的激活值的分布

向一個5層神經網絡(激活函數使用sigmoid函數)傳入隨機生成的輸入數據,用直方圖繪制各層激活值的數據分布。

# coding: utf-8
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import rcParams# 設置中文字體
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑體
rcParams['axes.unicode_minus'] = False  # 解決負號顯示問題def sigmoid(x):return 1 / (1 + np.exp(-x))def ReLU(x):return np.maximum(0, x)def tanh(x):return np.tanh(x)input_data = np.random.randn(1000, 100)  # 1000個數據
node_num = 100  # 各隱藏層節點(神經元)數
hidden_layer_size = 5  # 隱藏的層有5層
activations = {}  # 激活值的結果保存在這里x = input_datafor i in range(hidden_layer_size):if i != 0:x = activations[i-1]# 改變初始值進行實驗!w = np.random.randn(node_num, node_num) * 1# w = np.random.randn(node_num, node_num) * 0.01# w = np.random.randn(node_num, node_num) * np.sqrt(1.0 / node_num) # Xavier初始值,適用 sigmoid、tanh等S型曲線# w = np.random.randn(node_num, node_num) * np.sqrt(2.0 / node_num) # He初始值,適用 ReLUa = np.dot(x, w)# 將激活函數的種類也改變,來進行實驗!z = sigmoid(a)# z = ReLU(a)# z = tanh(a)activations[i] = z# 繪制直方圖
for i, a in activations.items():plt.subplot(1, len(activations), i+1)plt.title(str(i+1) + "-layer")if i != 0: plt.yticks([], [])# plt.xlim(0.1, 1)# plt.ylim(0, 7000)plt.hist(a.flatten(), 30, range=(0,1))# plt.hist(a.flatten(), 30)if i == 0:plt.xlabel("標準差為1的高斯分布作為權重初始值時的sigmoid的各層激活值的分布", loc='left')
plt.show()

在這里插入圖片描述

各層的激活值呈偏向0和1的分布。這里使用的sigmoid函數是S型函數,隨著輸出不斷地靠近0(或者靠近1),它的導數的值逐漸接近0。因此,偏向0和1的數據分布會造成反向傳播中梯度的值不斷變小,最后消失。這個問題稱為梯度消失(gradient vanishing)。層次加深的深度學習中,梯度消失的問題可能會更加嚴重。

在這里插入圖片描述

集中在0.5附近的分布。沒有偏向0和1,所以不會發生梯度消失的問題。但是,激活值的分布有所偏向,不同數量的神經元的輸出幾乎相同,說明在表現力上會有很大問題。因此,激活值在分布上有所偏向會出現“表現力受限”的問題。

各層的激活值的分布都要求有適當的廣度。為什么呢?因為通過在各層間傳遞多樣性的數據,神經網絡可以進行高效的學習。反過來,如果傳遞的是有所偏向的數據,就會出現梯度消失或者“表現力受限”的問題,導致學習可能無法順利進行。

Xavier初始值

Xavier的論文中,為了使各層的激活值呈現出具有相同廣度的分布,推導了合適的權重尺度。推導出的結論是,如果前一層的節點數為 n n n,則初始值使用標準差為的分布 1 n \frac{1}{\sqrt{n}} n ?1?

在這里插入圖片描述

越是后面的層,圖像變得越歪斜,但是呈現了比之前更有廣度的分布。因為各層間傳遞的數據有適當的廣度,所以sigmoid函數的表現力不受限制,有望進行高效的學習。

在這里插入圖片描述

使用tanh函數后,會呈漂亮的吊鐘型分布。tanh函數和sigmoid函數同是 S型曲線函數,但tanh函數是關于原點(0, 0)對稱的 S型曲線,而sigmoid函數是關于(x, y)=(0, 0.5)對稱的S型曲線。

用作激活函數的函數最好具有關于原點對稱的性質。

He初始值

Xavier初始值是以激活函數是線性函數為前提而推導出來的。因為sigmoid函數和tanh函數左右對稱,且中央附近可以視作線性函數,所以適合使用Xavier初始值。

但當激活函數使用ReLU時,一般推薦使用ReLU專用的初始值,He初始值。

當前一層的節點數為 n n n時,He初始值使用標準差為 2 n \sqrt{\frac{2}{n}} n2? ? 的高斯分布。當Xavier初始值是 1 n \sqrt{\frac{1}{n}} n1? ?時,(直觀上)可以解釋為,因為ReLU的負值區域的值為0,為了使它更有廣度,所以需要2倍的系數。

在這里插入圖片描述

當“std = 0.01”時,各層的激活值非常小 。神經網絡上傳遞的是非常小的值,說明逆向傳播時權重的梯度也同樣很小。這是很嚴重的問題,實際上學習基本上沒有進展。

在這里插入圖片描述

隨著層的加深,偏向一點點變大。實際上,層加深后,激活值的偏向變大,學習時會出現梯度消失的問題。

在這里插入圖片描述

各層中分布的廣度相同。由于即便層加深,數據的廣度也能保持不變,因此逆向傳播時,也會傳遞合適的值。

當激活函數使用ReLU時,權重初始值使用He初始值,當激活函數為sigmoid或tanh等S型曲線函數時,初始值使用Xavier初始值。這是目前的最佳實踐。

在這里插入圖片描述

神經網絡有5層,每層有100個神經元,激活函數使用的是ReLU。
從上圖分析可知,std = 0.01時完全無法進行學習。這和剛才觀察到的激活值的分布一樣,是因為正向傳播中傳遞的值很小(集中在0附近的數據)。因此,逆向傳播時求到的梯度也很小,權重幾乎不進行更新。相反,當權重初始值為Xavier初始值和He初始值時,學習進行得很順利。并且,我們發現He初始值時的學習進度更快一些。

# coding: utf-8
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.util import smooth_curve
from common.multi_layer_net import MultiLayerNet
from common.optimizer import SGD
from matplotlib import rcParams# 設置中文字體
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑體
rcParams['axes.unicode_minus'] = False  # 解決負號顯示問題# 0:讀入MNIST數據==========
(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True)
train_size = x_train.shape[0]
batch_size = 128
max_iterations = 2000# 1:進行實驗的設置==========
weight_init_types = {'std=0.01': 0.01, 'Xavier': 'sigmoid', 'He': 'relu'}
optimizer = SGD(lr=0.01)networks = {}
train_loss = {}
for key, weight_type in weight_init_types.items():networks[key] = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100],output_size=10, weight_init_std=weight_type)train_loss[key] = []# 2:開始訓練==========
for i in range(max_iterations):batch_mask = np.random.choice(train_size, batch_size)x_batch = x_train[batch_mask]t_batch = t_train[batch_mask]for key in weight_init_types.keys():grads = networks[key].gradient(x_batch, t_batch)optimizer.update(networks[key].params, grads)loss = networks[key].loss(x_batch, t_batch)train_loss[key].append(loss)if i % 100 == 0:print("===========" + "iteration:" + str(i) + "===========")for key in weight_init_types.keys():loss = networks[key].loss(x_batch, t_batch)print(key + ":" + str(loss))# 3.繪制圖形==========
markers = {'std=0.01': 'o', 'Xavier': 's', 'He': 'D'}
x = np.arange(max_iterations)
for key in weight_init_types.keys():plt.plot(x, smooth_curve(train_loss[key]), marker=markers[key], markevery=100, label=key)plt.xlabel("學習迭代次數")
plt.ylabel("損失函數值")
plt.title("基于MNIST數據集的權重初始值的比較")
plt.ylim(0, 2.5)
plt.legend()
plt.show()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80770.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80770.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80770.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TCP首部格式及三次握手四次揮手

TCP協議詳解:首部格式與連接管理 一、TCP首部格式 TCP首部最小20字節,最大60字節,包含以下字段: | 源端口號(16bit) | 目的端口號(16bit) | | 序列號(32bit) | | 確認號(32bit) | | 數據偏移(4bit)| 保留(6bit) |U|A|P|R|S|…

Pytorch的Dataloader使用詳解

PyTorch 的 DataLoader 是數據加載的核心組件,它能高效地批量加載數據并進行預處理。 Pytorch DataLoader基礎概念 DataLoader基礎概念 DataLoader是PyTorch基礎概念 DataLoader是PyTorch中用于加載數據的工具,它可以:批量加載數據&#xf…

HTML、CSS 和 JavaScript 基礎知識點

HTML、CSS 和 JavaScript 基礎知識點 一、HTML 基礎 1. HTML 文檔結構 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…

亞遠景-對ASPICE評估體系的深入研究與分析

一、ASPICE評估體系的定義與背景 ASPICE&#xff08;Automotive Software Process Improvement and Capability Determination&#xff09;即汽車軟件過程改進及能力測定模型&#xff0c;是由歐洲20多家主要汽車制造商共同制定的&#xff0c;專門針對汽車行業的軟件開發過程評…

灰度圖像和RGB圖像在數據大小和編碼處理方式差別

技術背景 好多開發者對灰度圖像和RGB圖像有些認知差異&#xff0c;今天我們大概介紹下二者差別。灰度圖像&#xff08;Grayscale Image&#xff09;和RGB圖像在編碼處理時&#xff0c;數據大小和處理方式的差別主要體現在以下幾個方面&#xff1a; 1. 通道數差異 圖像類型通道…

從爬蟲到網絡---<基石9> 在VPS上沒搞好Docker項目,把他卸載干凈

1.停止并刪除所有正在運行的容器 docker ps -a # 查看所有容器 docker stop $(docker ps -aq) # 停止所有容器 docker rm $(docker ps -aq) # 刪除所有容器如果提示沒有找到容器&#xff0c;可以忽略這些提示。 2.刪除所有鏡像 docker images # 查看所有鏡像 dock…

Centos 上安裝Klish(clish)的編譯和測試總結

1&#xff0c;介紹 clish是一個類思科命令行補全與執行程序&#xff0c;它可以幫助程序員在nix操作系統上實現功能導引、命令補全、命令執行的程序。支持&#xff1f;&#xff0c;help, Tab按鍵。本文基于klish-2.2.0介紹編譯和測試。 2&#xff0c;klish的編譯 需要安裝的庫&…

理解計算機系統_并發編程(3)_基于I/O復用的并發(二):基于I/O多路復用的并發事件驅動服務器

前言 以<深入理解計算機系統>(以下稱“本書”)內容為基礎&#xff0c;對程序的整個過程進行梳理。本書內容對整個計算機系統做了系統性導引,每部分內容都是單獨的一門課.學習深度根據自己需要來定 引入 接續上一帖理解計算機系統_并發編程(2)_基于I/O復用的并發…

系統可靠性分析:指標解析與模型應用全覽

以下是關于系統可靠性分析中可靠性指標、串聯系統與并聯系統、混合系統、系統可靠性模型的相關內容&#xff1a; 一、可靠性指標 可靠度&#xff1a;是系統、設備或元件在規定條件和規定時間內完成規定功能的概率。假設一個系統由多個部件組成&#xff0c;每個部件都有其自身…

數字高程模型(DEM)公開數據集介紹與下載指南

數字高程模型&#xff08;DEM&#xff09;公開數據集介紹與下載指南 數字高程模型&#xff08;Digital Elevation Model, DEM&#xff09;廣泛應用于地理信息系統&#xff08;GIS&#xff09;、水文模擬、城市規劃、環境分析、災害評估等領域。本文系統梳理了主流的DEM公開數據…

Python+大模型 day01

Python基礎 計算機系統組成 基礎語法 如:student_num 4.標識符要做到見名知意,增強代碼的可讀性 關鍵字 系統或者Python定義的,有特殊功能的字符組合 在學習過程中,文件名沒有遵循標識符命名規則,是為了按序號編寫文件方便查找復習 但是,在開發中,所有的Python文件名稱必須…

C++引用編程練習

#include <iostream> using namespace std; double vals[] {10.1, 12.6, 33.1, 24.1, 50.0}; double& setValues(int i) { double& ref vals[i]; return ref; // 返回第 i 個元素的引用&#xff0c;ref 是一個引用變量&#xff0c;ref 引用 vals[i] } // 要調用…

機密虛擬機的威脅模型

本文將介紹近年興起的機密虛擬機&#xff08;Confidential Virtual Machine&#xff09;技術所旨在抵御的威脅模型&#xff0c;主要關注內存機密性&#xff08;confidentiality&#xff09;和內存完整性&#xff08;integrity&#xff09;兩個方面。在解釋該威脅可能造成的問題…

【Rust trait特質】如何在Rust中使用trait特質,全面解析與應用實戰

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…

Simulink模型回調

Simulink 模型回調函數是一種特殊的 MATLAB 函數&#xff0c;可在模型生命周期的特定階段自動執行。它們允許用戶自定義模型行為、執行初始化任務、驗證參數或記錄數據。以下是各回調函數的詳細說明&#xff1a; 1. PreLoadFcn 觸發時機&#xff1a;Simulink 模型加載到內存之…

FPGA:Xilinx Kintex 7實現DDR3 SDRAM讀寫

在Xilinx Kintex 7系列FPGA上實現對DDR3 SDRAM的讀寫&#xff0c;主要依賴Xilinx提供的Memory Interface Generator (MIG) IP核&#xff0c;結合Vivado設計流程。以下是詳細步驟和關鍵點&#xff1a; 1. 準備工作 硬件需求&#xff1a; Kintex-7 FPGA&#xff08;如XC7K325T&…

Python爬蟲實戰:研究進制流數據,實現逆向解密

1. 引言 1.1 研究背景與意義 在現代網絡環境中,數據加密已成為保護信息安全的重要手段。許多網站和應用通過二進制流數據傳輸敏感信息,如視頻、金融交易數據等。這些數據通常經過復雜的加密算法處理,直接分析難度較大。逆向工程進制流數據不僅有助于合法的數據獲取與分析,…

Java Spring Boot項目目錄規范示例

以下是一個典型的 Java Spring Boot 項目目錄結構規范示例&#xff0c;結合了分層架構和模塊化設計的最佳實踐&#xff1a; text 復制 下載 src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── example/ │ │ └── myapp/ │…

圖像顏色理論與數據挖掘應用的全景解析

文章目錄 一、圖像顏色系統的理論基礎1.1 圖像數字化的本質邏輯1.2 顏色空間的數學框架1.3 量化過程的技術原理 二、主要顏色空間的深度解析2.1 RGB顏色空間的加法原理2.2 HSV顏色空間的感知模型2.3 CMYK顏色空間的減色原理 三、圖像幾何屬性與高級特征3.1 分辨率與像素密度的關…

mysql兩張關聯表批量更新一張表存在數據,而另一張表不存在數據的sql

一、mysql兩張關聯表批量更新一張表存在、另一張表不存在的數據 創建user和user_order表 CREATE TABLE user (id varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,id_card varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NU…