🏷️sec_convexity
Tính lồi đóng vai trò then chốt trong việc thiết kế các thuật toán tối ưu.
Điều này phần lớn là do tính lồi giúp việc phân tích và kiểm tra thuật toán trở nên dễ dàng hơn.
Nói cách khác, nếu thuật toán hoạt động kém ngay cả khi có tính lồi thì ta không nên kì vọng rằng sẽ thu được kết quả tốt trong trường hợp khác.
Hơn nữa, mặc dù các bài toán tối ưu hóa trong học sâu đa phần là không lồi, chúng lại thường thể hiện một số tính chất lồi gần các cực tiểu.
Điều này dẫn đến các biến thể tối ưu hóa thú vị mới như :cite:Izmailov.Podoprikhin.Garipov.ea.2018
.
Chúng ta hãy bắt đầu với các kiến thức cơ bản trước.
Tập hợp là nền tảng của tính lồi.
Nói một cách đơn giản, một tập hợp
Điều này nghe có vẻ hơi trừu tượng.
Hãy xem qua bức ảnh :numref:fig_pacman
.
Tập hợp đầu tiên là không lồi do tồn tại các đoạn thẳng không nằm trong tập hợp.
Hai tập hợp còn lại thì không gặp vấn đề như vậy.
Chỉ một mình định nghĩa thôi thì sẽ không có tác dụng gì trừ khi bạn có thể làm gì đó với chúng.
Trong trường hợp này, ta có thể nhìn vào phép hợp và phép giao trong :numref:fig_convex_intersect
.
Giả sử
Ta sẽ củng cố kết quả này thêm một chút với mệnh đề: giao của các tập lồi fig_nonconvex
chứa một vài phần không thuộc cả
Thông thường, các bài toán trong học sâu đều được định nghĩa trong các miền lồi.
Ví dụ
Giờ ta đã biết về tập hợp lồi, ta sẽ làm việc tiếp với các hàm số lồi
Để minh họa cho điều này, chúng ta sẽ vẽ đồ thị của một vài hàm số và kiểm tra xem hàm số nào thỏa mãn điều kiện trên. Ta sẽ cần phải nhập một vài gói thư viện.
%matplotlib inline
from d2l import mxnet as d2l
from mpl_toolkits import mplot3d
from mxnet import np, npx
npx.set_np()
Hãy định nghĩa một vài hàm số, cả lồi lẫn không lồi.
#@tab all
f = lambda x: 0.5 * x**2 # Convex
g = lambda x: d2l.cos(np.pi * x) # Nonconvex
h = lambda x: d2l.exp(0.5 * x) # Convex
x, segment = d2l.arange(-2, 2, 0.01), d2l.tensor([-1.5, 1])
d2l.use_svg_display()
_, axes = d2l.plt.subplots(1, 3, figsize=(9, 3))
for ax, func in zip(axes, [f, g, h]):
d2l.plot([x, segment], [func(x), func(segment)], axes=ax)
Như dự đoán, hàm cô-sin là hàm không lồi, trong khi hàm parabol và hàm số mũ là hàm lồi.
Lưu ý rằng để điều kiện trên có ý nghĩa thì
Một trong những công cụ hữu dụng nhất là bất đẳng thức Jensen. Nó là sự tổng quát hóa của định nghĩa về tính lồi:
với
Một trong các ứng dụng phổ biến của bất đẳng thức Jensen liên quan đến log hợp lý của các biến ngẫu nhiên quan sát được một phần. Ta có
Điều này xảy ra vì
Các hàm lồi có một vài tính chất hữu ích dưới đây.
Cụ thể, các hàm lồi không có cực tiểu cục bộ.
Hãy giả định điều ngược lại là đúng và chứng minh nó sai. Nếu
Điều này mâu thuẫn với giả định rằng
#@tab all
f = lambda x: (x-1)**2 * (x+1)
d2l.set_figsize()
d2l.plot([x, segment], [f(x), f(segment)], 'x', 'f(x)')
Tính chất "các hàm lồi không có cực tiểu cục bộ" rất tiện lợi.
Điều này có nghĩa là ta sẽ không bao giờ "mắc kẹt" khi cực tiểu hóa các hàm số.
Dù vậy, hãy lưu ý rằng điều này không có nghĩa là hàm số không thể có nhiều hơn một cực tiểu toàn cục, hoặc liệu hàm số có tồn tại cực tiểu toàn cục hay không.
Ví dụ, hàm
Các hàm số lồi định nghĩa các tập hợp lồi là các tập-dưới (below-sets) như sau:
Ta hãy chứng minh nó một cách vắn tắt.
Hãy nhớ rằng với mọi
Hãy nhìn vào đồ thị hàm
#@tab all
x, y = d2l.meshgrid(d2l.linspace(-1, 1, 101), d2l.linspace(-1, 1, 101))
z = x**2 + 0.5 * d2l.cos(2 * np.pi * y)
# Plot the 3D surface
d2l.set_figsize((6, 4))
ax = d2l.plt.figure().add_subplot(111, projection='3d')
ax.plot_wireframe(x, y, z, **{'rstride': 10, 'cstride': 10})
ax.contour(x, y, z, offset=-1)
ax.set_zlim(-1, 1.5)
# Adjust labels
for func in [d2l.plt.xticks, d2l.plt.yticks, ax.set_zticks]:
func([-1, 0, 1])
Bất cứ khi nào đạo hàm bậc hai của một hàm số tồn tại, việc kiểm tra tính lồi của hàm số là rất đơn giản.
Tất cả những gì cần làm là kiểm tra liệu
Có thể nhận ra rằng chúng ta chỉ cần chứng minh tính chất này cho các hàm số một chiều.
Xét cho cùng, ta luôn có thể định nghĩa một hàm số
Để thấy tại sao
Vì đạo hàm bậc hai được đưa ra bởi giới hạn trên sai phân hữu hạn, nó dẫn tới
Để chứng minh điều ngược lại, ta dùng lập luận rằng
Từ tính chất đơn điệu
Theo hình học, nó dẫn đến
#@tab all
f = lambda x: 0.5 * x**2
x = d2l.arange(-2, 2, 0.01)
axb, ab = d2l.tensor([-1.5, -0.5, 1]), d2l.tensor([-1.5, 1])
d2l.set_figsize()
d2l.plot([x, axb, ab], [f(x) for x in [x, axb, ab]], 'x', 'f(x)')
d2l.annotate('a', (-1.5, f(-1.5)), (-1.5, 1.5))
d2l.annotate('b', (1, f(1)), (1, 1.5))
d2l.annotate('x', (-0.5, f(-0.5)), (-1.5, f(-0.5)))
Một trong những tính chất hữu ích của tối ưu hóa lồi là nó cho phép chúng ta xử lý các ràng buộc một cách hiệu quả. Nó cho phép ta giải quyết các bài toán dưới dạng:
Nhìn chung, giải quyết một bài toán tối ưu hóa bị ràng buộc là tương đối khó khăn. Có một cách giải quyết bắt nguồn từ vật lý dựa trên một trực giác khá đơn giản. Hãy tưởng tượng có một quả banh bên trong một chiếc hộp. Quả banh sẽ lăn đến nơi thấp nhất và trọng lực sẽ cân bằng với lực nâng của các cạnh hộp tác động lên quả banh. Tóm lại, gradient của hàm mục tiêu (ở đây là trọng lực) sẽ được bù lại bởi gradient của hàm ràng buộc (cần phải nằm trong chiếc hộp, bị các bức tưởng "đẩy lại"). Lưu ý rằng bất kỳ ràng buộc nào không kích hoạt (quả banh không đụng đến bức tường) thì sẽ không có bất kỳ một lực tác động nào lên quả banh.
Ta hãy bỏ qua phần diễn giải chứng minh của hàm số Lagrange Boyd.Vandenberghe.2004
).
Lý luận bên trên có thể được mô tả thông qua bài toán tối ưu hóa điểm yên ngựa:
Các biến
Có một cách để thỏa mãn, ít nhất là theo xấp xỉ, các bài toán tối ưu hóa bị ràng buộc là phỏng theo hàm Lagrange
Thực tế, chúng ta đã dùng thủ thuật này khá thường xuyên.
Hãy xét đến suy giảm trọng số trong :numref:sec_weight_decay
.
Ở đó chúng ta thêm
Nhìn chung, thêm các lượng phạt là một cách tốt để đảm bảo việc thỏa mãn ràng buộc xấp xỉ. Trong thực tế, hóa ra phương pháp này ổn định hơn rất nhiều so với trường hợp thỏa mãn chuẩn xác. Hơn nữa, với các bài toán không lồi, những tính chất khiến phương án tiếp cận chuẩn xác trở nên rất thu hút trong trường hợp lồi (ví dụ như tính tối ưu) không còn đảm bảo nữa.
Một chiến lược khác để thỏa mãn các ràng buộc là các phép chiếu.
Chúng ta cũng đã gặp chúng trước đây, ví dụ như khi bàn về phương pháp gọt gradient ở :numref:sec_rnn_scratch
.
Ở phần đó chúng ta đã đảm bảo rằng gradient có độ dài ràng buộc bởi
Hóa ra đây là một phép chiếu của
$$\mathrm{Proj}X(\mathbf{x}) = \mathop{\mathrm{argmin}}{\mathbf{x}' \in X} |\mathbf{x} - \mathbf{x}'|_2.$$
Do đó đây là điểm gần nhất trong fig_projections
sẽ giải thích nó một cách rõ ràng hơn.
Ở đó ta có hai tập lồi, một hình tròn và một hình thoi.
Các điểm nằm bên trong tập (màu vàng) giữ nguyên không đổi.
Các điểm nằm bên ngoài tập (màu đen) được ánh xạ tới điểm gần nhất bên trong tập (màu đỏ).
Trong khi với các khối cầu
Một trong những ứng dụng của các phép chiếu lồi là để tính toán các vector trọng số thưa.
Trong trường hợp này chúng ta chiếu
Trong bối cảnh học sâu, mục đích chính của các hàm lồi là để thúc đẩy sự phát triển các thuật toán tối ưu hóa và giúp ta hiểu chúng một cách chi tiết. Phần tiếp theo chúng ta sẽ thấy cách mà hạ gradient và hạ gradient ngẫu nhiên có thể được suy ra từ đó.
- Giao của các tập lồi là tập lồi. Hợp của các tập lồi không bắt buộc phải là tập lồi.
- Kỳ vọng của hàm lồi lớn hơn hàm lồi của kỳ vọng (Bất đẳng thức Jensen).
- Hàm khả vi hai lần là hàm lồi khi và chỉ khi đạo hàm bậc hai của nó chỉ có các trị riêng không âm ở mọi nơi.
- Các ràng buộc lồi có thể được thêm vào hàm Lagrange. Trong thực tế, ta chỉ việc thêm chúng cùng với một mức phạt vào hàm mục tiêu.
- Các phép chiếu ánh xạ đến các điểm trong tập (lồi) nằm gần nhất với điểm gốc.
- Giả sử chúng ta muốn xác minh tính lồi của tập hợp bằng cách vẽ mọi đoạn thẳng giữa các điểm bên trong tập hợp và kiểm tra liệu các đoạn thẳng có nằm trong tập hợp đó hay không.
- Hãy chứng mình rằng ta chỉ cần kiểm tra các điểm ở biên là đủ.
- Hãy chứng minh rằng ta chỉ cần kiểm tra các đỉnh của tập hợp là đủ.
- Ký hiệu khối cầu có bán kính
$r$ sử dụng chuẩn$p$ là$B_p[r] := {\mathbf{x} | \mathbf{x} \in \mathbb{R}^d \text{ và } |\mathbf{x}|_p \leq r}$ . Hãy chứng minh rằng$B_p[r]$ là lồi với mọi$p \geq 1$ . - Cho các hàm lồi
$f$ và$g$ sao cho$\mathrm{max}(f, g)$ cũng là hàm lồi. Hãy chứng minh rằng$\mathrm{min}(f, g)$ không lồi. - Hãy chứng minh rằng hàm softmax được chuẩn hóa là hàm lồi. Cụ thể hơn, chứng minh tính lồi của
$f(x) = \log \sum_i \exp(x_i)$ . - Hãy chứng minh rằng các không gian con tuyến tính là các tập lồi. Ví dụ,
$X = {\mathbf{x} | \mathbf{W} \mathbf{x} = \mathbf{b}}$ . - Hãy chứng minh rằng trong trường hợp của các không gian con tuyến tính với
$\mathbf{b} = 0$ , phép chiếu$\mathrm{Proj}_X$ có thể được viết dưới dạng$\mathbf{M} \mathbf{x}$ với một ma trận$\mathbf{M}$ nào đó. - Hãy chỉ ra rằng với các hàm số khả vi hai lần
$f$ , ta có thể viết$f(x + \epsilon) = f(x) + \epsilon f'(x) + \frac{1}{2} \epsilon^2 f''(x + \xi)$ với một giá trị$\xi \in [0, \epsilon]$ nào đó. - Cho vector
$\mathbf{w} \in \mathbb{R}^d$ với$|\mathbf{w}|_1 > 1$ , hãy tính phép chiếu lên khối cầu đơn vị$\ell_1$ .- Như một bước trung gian, hãy viết ra mục tiêu có lượng phạt
$|\mathbf{w} - \mathbf{w}'|_2^2 + \lambda |\mathbf{w}'|_1$ và tính ra đáp án với$\lambda > 0$ . - Bạn có thể tìm ra giá trị 'chính xác' của
$\lambda$ mà không phải đoán mò quá nhiều lần không?
- Như một bước trung gian, hãy viết ra mục tiêu có lượng phạt
- Cho tập lồi
$X$ và hai vector$\mathbf{x}$ ,$\mathbf{y}$ , hãy chứng minh rằng các phép chiếu không bao giờ làm tăng khoảng cách, ví dụ,$|\mathbf{x} - \mathbf{y}| \geq |\mathrm{Proj}_X(\mathbf{x}) - \mathrm{Proj}_X(\mathbf{y})|$ .
Bản dịch trong trang này được thực hiện bởi:
- Đoàn Võ Duy Thanh
- Phạm Hồng Vinh
- Lê Khắc Hồng Phúc
- Nguyễn Văn Quang
- Nguyễn Lê Quang Nhật
- Phạm Minh Đức
- Võ Tấn Phát