🏷️sec_sgd
Trong phần này chúng tôi sẽ giới thiệu các nguyên tắc cơ bản của hạ gradient ngẫu nhiên.
%matplotlib inline
from d2l import mxnet as d2l
import math
from mxnet import np, npx
npx.set_np()
Trong học sâu, hàm mục tiêu thường là trung bình của các hàm mất mát cho từng mẫu trong tập huấn luyện.
Giả sử tập huấn luyện có
Gradient của hàm mục tiêu tại
Nếu hạ gradient được sử dụng, chi phí tính toán cho mỗi vòng lặp độc lập là
Hạ gradient ngẫu nhiên (stochastic gradient descent - SGD) giúp giảm chi phí tính toán ở mỗi vòng lặp.
Ở mỗi vòng lặp, ta lấy ngẫu nhiên một mẫu dữ liệu có chỉ số
Ở đây,
$$\mathbb{E}i \nabla f_i(\mathbf{x}) = \frac{1}{n} \sum{i = 1}^n \nabla f_i(\mathbf{x}) = \nabla f(\mathbf{x}).$$
Do đó, trên trung bình, gradient ngẫu nhiên là một ước lượng gradient tốt.
Bây giờ, ta mô phỏng hạ gradient ngẫu nhiên bằng cách thêm nhiễu ngẫu nhiên với trung bình bằng 0 và phương sai bằng 1 vào gradient và so sánh với phương pháp hạ gradient.
#@tab all
f = lambda x1, x2: x1 ** 2 + 2 * x2 ** 2 # Objective
gradf = lambda x1, x2: (2 * x1, 4 * x2) # Gradient
def sgd(x1, x2, s1, s2):
global lr # Learning rate scheduler
(g1, g2) = gradf(x1, x2)
# Simulate noisy gradient
g1 += d2l.normal(0.0, 1, (1,))
g2 += d2l.normal(0.0, 1, (1,))
eta_t = eta * lr() # Learning rate at time t
return (x1 - eta_t * g1, x2 - eta_t * g2, 0, 0) # Update variables
eta = 0.1
lr = (lambda: 1) # Constant learning rate
d2l.show_trace_2d(f, d2l.train_2d(sgd, steps=50))
Như có thể thấy, quỹ đạo của các biến trong SGD dao động mạnh hơn hạ gradient ở phần trước.
Điều này là do bản chất ngẫu nhiên của gradient.
Tức là, ngay cả khi tới gần giá trị cực tiểu, ta vẫn gặp phải sự bất định gây ra bởi gradient ngẫu nhiên
Đây cũng là lý do cho việc thêm hàm tốc độ học lr
vào hàm bước sgd
.
Trong ví dụ trên, chức năng định thời tốc độ học (learning rate scheduling) không được kích hoạt vì ta đặt hàm lr
bằng một hằng số, tức lr = (lambda: 1)
.
Thay thế
Trong trường hợp đầu tiên, ta giảm tốc độ học bất cứ khi nào tiến trình tối ưu bị đình trệ.
Đây là một chiến lược phổ biến để huấn luyện các mạng sâu.
Ngoài ra, ta có thể làm giảm tốc độ học nhanh hơn bằng suy giảm theo lũy thừa.
Thật không may, phương pháp này dẫn đến việc dừng tối ưu quá sớm trước khi thuật toán hội tụ.
Một lựa chọn phổ biến khác là suy giảm đa thức với
#@tab all
def exponential():
global ctr
ctr += 1
return math.exp(-0.1 * ctr)
ctr = 1
lr = exponential # Set up learning rate
d2l.show_trace_2d(f, d2l.train_2d(sgd, steps=1000))
Như dự đoán, giá trị phương sai của các tham số giảm đáng kể.
Tuy nhiên, suy giảm lũy thừa không hội tụ tới nghiệm tối ưu
#@tab all
def polynomial():
global ctr
ctr += 1
return (1 + 0.1 * ctr)**(-0.5)
ctr = 1
lr = polynomial # Set up learning rate
d2l.show_trace_2d(f, d2l.train_2d(sgd, steps=50))
Vẫn còn có rất nhiều lựa chọn khác để thiết lập tốc độ học. Ví dụ, ta có thể bắt đầu với tốc độ học nhỏ, sau đó tăng nhanh rồi tiếp tục giảm nhưng với tốc độ chậm hơn. Ta cũng có thể thiết lập tốc độ học tăng và giảm luân phiên. Có rất nhiều cách khác nhau để định thời tốc độ học. Bây giờ, chúng ta hãy tập trung vào thiết lập tốc độ học trong điều kiện lồi mà ta có thể phân tích lý thuyết. Với bài toán không lồi tổng quát, rất khó để đảm bảo được mức hội tụ có ý nghĩa, vì nói chung các bài toán tối ưu phi tuyến không lồi đều thuộc dạng NP-hard. Để tìm hiểu thêm, tham khảo các ví dụ trong tập bài giảng của Tibshirani năm 2015.
Đây là phần đọc thêm để mang lại cái nhìn trực quan hơn về bài toán,
giới hạn lại trong một cách chứng minh đơn giản được trình bày trong :cite:Nesterov.Vial.2000
.
Cũng có những cách chứng minh nâng cao hơn, ví dụ như khi hàm mục tiêu được định nghĩa tốt.
:cite: Hazan.Rakhlin.Bartlett.2008
chỉ ra rằng với các hàm lồi chặt, cụ thể là các hàm có cận dưới là
Xét trường hợp
$$\mathbf{w}{t+1} = \mathbf{w}{t} - \eta_t \partial_\mathbf{w} l(\mathbf{x}_t, \mathbf{w}).$$
Cụ thể, ta giả sử
là giá trị mất mát kỳ vọng và $R^$ là cực tiểu của hàm mất mát theo $\mathbf{w}$.
Ta kí hiệu $\mathbf{w}^$ là nghiệm tại cực tiểu (minimizer) với giả định giá trị này tồn tại trong miền xác định.
Trong trường hợp này, chúng ta lần theo khoảng cách giữa tham số hiện tại
$$\begin{aligned} |\mathbf{w}{t+1} - \mathbf{w}^*|^2 & = |\mathbf{w}{t} - \eta_t \partial_\mathbf{w} l(\mathbf{x}t, \mathbf{w}) - \mathbf{w}^*|^2 \ & = |\mathbf{w}{t} - \mathbf{w}^|^2 + \eta_t^2 |\partial_\mathbf{w} l(\mathbf{x}_t, \mathbf{w})|^2 - 2 \eta_t \left\langle \mathbf{w}_t - \mathbf{w}^, \partial_\mathbf{w} l(\mathbf{x}_t, \mathbf{w})\right\rangle. \end{aligned} $$
Gradient
Điều chúng ta thực sự quan tâm là khoảng cách giữa
$$ l(\mathbf{x}_t, \mathbf{w}^) \geq l(\mathbf{x}_t, \mathbf{w}_t) + \left\langle \mathbf{w}^ - \mathbf{w}t, \partial{\mathbf{w}} l(\mathbf{x}_t, \mathbf{w}_t) \right\rangle. $$
Kết hợp hai bất đẳng thức trên, ta tìm được cận cho khoảng cách giữa các tham số tại bước
$$|\mathbf{w}{t} - \mathbf{w}^*|^2 - |\mathbf{w}{t+1} - \mathbf{w}^|^2 \geq 2 \eta_t (l(\mathbf{x}_t, \mathbf{w}_t) - l(\mathbf{x}_t, \mathbf{w}^)) - \eta_t^2 L^2.$$
Điều này có nghĩa quá trình học vẫn sẽ cải thiện miễn là hiệu số giữa hàm mất mát hiện tại và giá trị mất mát tối ưu vẫn lớn hơn
Tiếp theo chúng ta tính giá trị kỳ vọng cho biểu thức trên
$$E_{\mathbf{w}t}\left[|\mathbf{w}{t} - \mathbf{w}^|^2\right] - E_{\mathbf{w}_{t+1}\mid \mathbf{w}t}\left[|\mathbf{w}{t+1} - \mathbf{w}^|^2\right] \geq 2 \eta_t [E[R[\mathbf{w}_t]] - R^*] - \eta_t^2 L^2.$$
Ở bước cuối cùng, ta tính tổng các bất đẳng thức trên cho mọi
$$|\mathbf{w}{0} - \mathbf{w}^*|^2 \geq 2 \sum{t=1}^T \eta_t [E[R[\mathbf{w}t]] - R^*] - L^2 \sum{t=1}^T \eta_t^2.$$
Lưu ý rằng ta tận dụng
$$\bar{\mathbf{w}} := \frac{\sum_{t=1}^T \eta_t \mathbf{w}t}{\sum{t=1}^T \eta_t}.$$
Từ đó, theo tính chất lồi, ta có
Thay vào bất đẳng thức ở trên, ta tìm được cận
Trong đó
-
Thời điểm xác định.
Với mỗi
$r, L$ và$T$ xác định ta có thể chọn$\eta = r/L \sqrt{T}$ . Biểu thức này dẫn tới giới hạn trên$r L (1 + 1/T)/2\sqrt{T} < rL/\sqrt{T}$ . Điều này nghĩa là hàm sẽ hội tụ đến nghiệm tối ưu với tốc độ$\mathcal{O}(1/\sqrt{T})$ . -
Thời điểm chưa xác định.
Khi muốn nghiệm tốt cho bất kì thời điểm
$T$ nào, ta có thể chọn$\eta = \mathcal{O}(1/\sqrt{T})$ . Cách làm trên tốn thêm một thừa số logarit, dẫn tới giới hạn trên có dạng$\mathcal{O}(\log T / \sqrt{T})$ .
Chú ý rằng đối với những hàm mất mát lồi tuyệt đối
Tới phần này, ta đi khá nhanh và chưa chặt chẽ khi thảo luận về hạ gradient ngẫu nhiên.
Ta ngầm định lấy các đối tượng
Tuy nhiên, đó thật ra không phải là cách ta đã làm.
Trong các ví dụ đơn giản ở phần này ta chỉ thêm nhiễu vào gradient không ngẫu nhiên, tức giả sử đang có sẵn các cặp giá trị
Tương tự, ta có thể chỉ ra rằng xác suất chọn một mẫu đúng một lần là
- Đối với các bài toán lồi, ta có thể chứng minh rằng Hạ Gradient Ngẫu nhiên sẽ hội tụ về nghiệm tối ưu với nhiều tốc độ học khác nhau.
- Trường hợp trên thường không xảy ra trong học sâu. Tuy nhiên việc phân tích các bài toán lồi cho ta kiến thức hữu ích để tiếp cận bài toán tối ưu, đó là giảm dần tốc độ học, dù không quá nhanh.
- Nhiều vấn đề xuất hiện khi tốc độ học quá lớn hoặc quá nhỏ. Trong thực tế, ta chỉ có thể tìm được tốc độ học thích hợp sau nhiều lần thử nghiệm.
- Khi kích thước tập huấn luyện tăng, chi phí tính toán cho mỗi lần lặp của hạ gradient cũng tăng theo, do đó SGD được ưa chuộng hơn trong trường hợp này.
- Trong SGD, không có sự đảm bảo tối ưu đối với các trường hợp không lồi do số cực tiểu cần phải kiểm tra có thể tăng theo cấp số nhân.
- Hãy thử nghiệm với nhiều bộ định thời tốc độ học khác nhau trong SGD và với số vòng lặp khác nhau.
Cụ thể, hãy vẽ biểu đồ khoảng cách tới nghiệm tối ưu
$(0, 0)$ theo số vòng lặp. - Chứng minh rằng với hàm
$f(x_1, x_2) = x_1^2 + 2 x_2^2$ , việc thêm nhiễu Gauss (normal noise) vào gradient tương đương với việc cực tiểu hóa hàm mất mát$l(\mathbf{x}, \mathbf{w}) = (x_1 - w_1)^2 + 2 (x_2 - w_2)^2$ trong đó$x$ tuân theo phân phối chuẩn.- Suy ra kỳ vọng và phương sai của
$\mathbf{x}$ . - Chỉ ra rằng tính chất này có thể áp dụng tổng quát cho hàm mục tiêu
$f(\mathbf{x}) = \frac{1}{2} (\mathbf{x} - \mathbf{\mu})^\top Q (\mathbf{x} - \mathbf{\mu})$ với$Q \succeq 0$ .
- Suy ra kỳ vọng và phương sai của
- So sánh sự hội tụ của SGD khi lấy mẫu không hoàn lại từ
${(x_1, y_1), \ldots, (x_m, y_m)}$ và khi lấy mẫu có hoàn lại. - Bạn sẽ thay đổi SGD thế nào nếu như một số gradient (hoặc một số toạ độ liên kết với nó) liên tục lớn hơn tất cả các gradient khác?
- Giả sử
$f(x) = x^2 (1 + \sin x)$ .$f$ có bao nhiêu cực tiểu? Thay đổi hàm$f$ sao cho để cực tiểu hóa giá trị hàm này, ta cần xét tất cả các điểm cực tiểu?
- Đoàn Võ Duy Thanh
- Nguyễn Duy Du
- Phạm Minh Đức
- Nguyễn Văn Quang
- Đỗ Trường Giang
- Lê Khắc Hồng Phúc
- Phạm Hồng Vinh
- Nguyễn Văn Cường