Khởi tạo trọng số là một việc quan trọng khi phát triển các mô hình mạng nơ-ron học sâu.
Các nơ ron trong mạng nơ-ron bao gồm các tham số được gọi là trọng số được sử dụng để tính tổng trọng số của các đầu vào.
Các mô hình mạng nơ ron fit dữ liệu bằng cách sử dụng một thuật toán tối ưu hóa gọi là stochastic gradient descent để thay đổi từng bước trọng số mạng để giảm thiểu hàm loss, hy vọng tạo ra một bộ trọng số cho khả năng đưa ra các dự đoán hữu ích.
Khởi tạo trọng số là một thủ tục để đặt trọng số của mạng nơ-ron thành các giá trị ngẫu nhiên nhỏ để xác định điểm bắt đầu cho việc tối ưu hóa của mô hình mạng nơ-ron.
đào tạo mô hình deep learning là một nhiệm vụ khó khăn mà hầu hết các thuật toán bị ảnh hưởng mạnh bởi sự lựa chọn khởi tạo. Điểm ban đầu có thể xác định liệu thuật toán có hội tụ hay không, với một số điểm ban đầu không ổn định đến mức thuật toán gặp khó khăn và thất bại hoàn toàn.
Mỗi lần, mạng nơ-ron được khởi tạo với một tập trọng số khác nhau, dẫn đến một điểm khởi đầu khác nhau cho quá trình tối ưu hóa và có khả năng dẫn đến một tập hợp trọng số cuối cùng khác và hiệu suất của mạng sẽ khác nhau.
Khởi tạo trọng số cho Sigmoid và Tanh
Cách tiếp cận tiêu chuẩn để khởi tạo trọng số của các lớp mạng nơron và các nút sử dụng chức năng kích hoạt Sigmoid hoặc TanH được gọi là khởi tạo “glorot” hoặc “xavier”.
Xavier Weight Initialization
Phương pháp khởi tạo xavier được tính như một số ngẫu nhiên có phân phối xác suất đồng nhất (U) giữa phạm vi
[imath]- (1 / sqrt (n))[/imath]
và
[imath]1 / sqrt (n)[/imath]
, trong đó
[imath]n[/imath]
là số lượng đầu vào cho nút.
[math]weight = U [-(1/sqrt(n)), 1/sqrt(n)][/math]
Chúng ta có thể triển khai điều này trực tiếp bằng Python
# example of the xavier weight initialization
from math import sqrt
from numpy import mean
from numpy.random import rand
# number of nodes in the previous layer
n = 10
# calculate the range for the weights
lower, upper = -(1.0 / sqrt(n)), (1.0 / sqrt(n))
# generate random numbers
numbers = rand(1000)
# scale to the desired range
scaled = lower + numbers * (upper - lower)
# summarize
print(lower, upper)
print(scaled.min(), scaled.max())
print(scaled.mean(), scaled.std())
-0.31622776601683794 0.31622776601683794
-0.3157663248679193 0.3160839282916222
0.006806069733149146 0.17777128902976705
Normalized Xavier Weight Initialization
Phương pháp khởi tạo xavier chuẩn hóa được tính toán dưới dạng số ngẫu nhiên có phân phối xác suất đồng nhất (U) giữa phạm vi
[imath]- (sqrt (6) / sqrt (n + m))[/imath]
và
[imath]sqrt (6) / sqrt (n + m)[/imath]
, trong đó
[imath]n[/imath]
là số lượng đầu vào của nút (ví dụ: số nút trong lớp trước đó) và
[imath]m[/imath]
là số đầu ra từ lớp (ví dụ: số nút trong lớp hiện tại).
[math]weight = U [-(sqrt(6)/sqrt(n + m)), sqrt(6)/sqrt(n + m)][/math]
python code
# example of the normalized xavier weight initialization
from math import sqrt
from numpy import mean
from numpy.random import rand
# number of nodes in the previous layer
n = 10
# number of nodes in the next layer
m = 20
# calculate the range for the weights
lower, upper = -(sqrt(6.0) / sqrt(n + m)), (sqrt(6.0) / sqrt(n + m))
# generate random numbers
numbers = rand(1000)
# scale to the desired range
scaled = lower + numbers * (upper - lower)
# summarize
print(lower, upper)
print(scaled.min(), scaled.max())
print(scaled.mean(), scaled.std())
Chúng ta có thể thấy rằng trọng số được tạo tuân theo các giới hạn và giá trị trọng số trung bình gần bằng 0 với độ lệch chuẩn gần bằng 0,17.
-0.44721359549995787 0.44721359549995787
-0.4447861894315135 0.4463641245392874
-0.01135636099916006 0.2581340352889168
Khởi tạo trọng số cho Relu
Việc khởi tạo trọng số “xavier” được phát hiện có vấn đề khi được sử dụng để khởi tạo các mạng sử dụng chức năng kích hoạt tuyến tính (ReLU)
Do đó, một phiên bản sửa đổi của cách tiếp cận đã được phát triển đặc biệt cho các nút và lớp sử dụng kích hoạt ReLU, phổ biến trong các lớp ẩn của hầu hết các mô hình mạng nơ ron đa lớp và Perceptron nhiều lớp.
He Weight Initialization
Phương pháp khởi tạo he được tính toán dưới dạng một số ngẫu nhiên có phân phối xác suất Gaussian (G) với giá trị trung bình là 0,0 và độ lệch chuẩn là
[imath]sqrt (2 / n)[/imath]
, trong đó
[imath]n[/imath]
là số đầu vào cho nút.
[math]weight = G (0.0, sqrt(2/n))[/math]
python code
# example of the he weight initialization
from math import sqrt
from numpy.random import randn
# number of nodes in the previous layer
n = 10
# calculate the range for the weights
std = sqrt(2.0 / n)
# generate random numbers
numbers = randn(1000)
# scale to the desired range
scaled = numbers * std
# summarize
print(std)
print(scaled.min(), scaled.max())
print(scaled.mean(), scaled.std())
0.4472135954999579
-1.5736761136523203 1.433348584081719
-0.00023406487278826836 0.4522609460629265
Chúng ta có thể thấy rằng với rất ít đầu vào, phạm vi lớn, gần -1,5 và 1,5 hoặc -1,0 đến -1,0. Sau đó, có thể thấy phạm vi của chúng ta nhanh chóng giảm xuống khoảng 20 weight xuống gần -0,1 và 0,1, nơi nó không đổi một cách hợp lý.
kết luận
bên trên là một vài cách khởi tạo trọng số của mạng nơ ron tuỳ theo hàm kích hoạt.