1. Giải tích tích phân¶
Thực ra con người đã ứng dụng giải tích tích phân từ rất lâu trong đo đạc diện tích. Tính diện tích hình vuông, hình chữ nhật thì khá đơn giản nhưng làm sao để tính được diện tích của hình tròn? Người xưa đã biết cách chia nhỏ hình tròn thành những miếng bánh bằng nhau bằng những lát cắt đi qua tâm hình tròn. Sau đó xếp chúng lại theo hình răng cưa để thu được một hình chữ nhật. Dựa trên hình chữ nhật để tìm ra công thức tính diện tích hình tròn. Cách làm như vậy được gọi là phương pháp vét cạn.
Ngày nay việc với sự phát triển của giải tích tích phân thì việc tính diện tích hình tròn không còn là một vấn đề quá khó. Từ phương trình hình tròn:
Ta sẽ tìm cách thể biểu diễn \(y\) theo \(x\) trên miền \([-R, R]\). Đối với nửa đường tròn nằm trên trục \(y=0\):
và nửa đường tròn dưới trục \(y=0\):
Diện tích của hình tròn sẽ được tính thông qua công thức tích phân của hàm \(y=f(x)\):
Ngoài tính diện tích hình tròn, giải tích tích phân còn giúp ta tính được rất nhiều các hình phức tạp khác miễn là chúng ta biết được phương trình tường minh của chúng. Ngoài ra nó còn được dùng để xác định phân phối xác suất của biến và tính toán xác suất của các sự kiện trên một miền xác định dựa trên phân phối xác suất.
Qua các ví dụ trên chúng ta có thể thấy giải tích tích phân đóng vai trò quan trọng như thế nào trong thực tiễn.
2. Giải tích vi phân¶
giải tích vi phân cho phép ta hiểu được hàm số tốt hơn thông qua việc xác định tốc độ thay đổi của nó như thế nào tại một điểm dữ liệu. Thông qua đạo hàm chúng ta có thể khảo sát sự biến thiên của hàm số , tìm giá trị cực trị và tìm hướng di chuyển phù hợp để đi tới điểm cực trị địa phương. Đạo hàm của hàm \(f(x) : \mathbb{R} \mapsto \mathbb{R}\) được tính theo công thức:
Một ứng dụng rất thực tế của đạo hàm đó là gia tốc trong vật lý khi nó cho ta biết vận tốc sẽ thay đổi thế nào trong một khoảng thời gian rất ngắn chẳng hạn như 1 giây. Khi bạn đi xe, vận tốc sẽ không đều tại mọi điểm thời gian mà tuỳ vào bạn tăng ga hay giảm ga mà vận tốc tương ứng sẽ tăng hoặc giảm. Gia tốc chính là đạo hàm của vận tốc theo thời gian.
Trong thực tiễn, chúng ta có thể tính đạo hàm cho bất kỳ một hàm số nào thông qua công thức lim ở phương trình \((1)\).
import torch
# Tính đạo hàm của vận tốc f(x) = x^2+2*x
def _derivative(x):
f1 = x**2 + 2*x
delta = 0.001 # giá trị delta ở mẫu
x0 = x-delta
f0 = x0**2 + 2*x0
der = (f1-f0)/delta
return der
_derivative(10)
21.998999999979674
2.1. Những đạo hàm cơ bản¶
Trên thực tế thì chúng ta có một bảng mẫu có sẵn của một số đạo hàm cơ bản, đây là những đạo hàm đã được chứng minh và chúng ta có thể sử dụng chúng như cơ sở để tính những đạo hàm khác:
Phương trình |
Đạo hàm |
---|---|
$\(\frac{dx^a}{dx}\)$ |
$\(ax^{a-1}\)$ |
$\(\frac{de^x}{dx}\)$ |
$\(e^{x}\)$ |
$\(\frac{da^x}{dx}\)$ |
$\(a^{x} \ln{a}\)$ |
$\(\frac{d\ln x}{dx}\)$ |
$\(\frac{1}{x}\)$ |
$\(\frac{d \sin(x)}{dx}\)$ |
$\(\cos x\)$ |
$\(\frac{d \cos(x)}{dx}\)$ |
$\(-\sin x\)$ |
$\(\frac{d \tan(x)}{dx}\)$ |
$\(1+\tan^{2}(x)\)$ |
$\(\frac{d \arcsin(x)}{dx}\)$ |
$\(\frac{1}{\sqrt{1-x^2}}\)$ |
$\(\frac{d \arccos(x)}{dx}\)$ |
$\(\frac{-1}{\sqrt{1-x^2}}\)$ |
$\(\frac{d \arctan(x)}{dx}\)$ |
$\(\frac{1}{1+x^2}\)$ |
Trong công thức \(f(x) = x^2+2x\) ở trên ta thấy đạo hàm của hàm số sấp xỉ 22. Đạo hàm của \(f(x)\) cũng chính là \(f'(x)=2x+2\) và cũng trả ra giá trị là 22. Như vậy công thức lim đã tính ra giá trị gần đúng của đạo hàm.
2.2. Các qui tắc đạo hàm¶
Ở trên là những đạo hàm của những hàm cơ bản . Ngoài ra chúng ta có các qui tắc đạo hàm như bên dưới để thực thi tính toán đạo hàm với những hàm phức tạp hơn. Để rút gọn mình ký hiệu \(\frac{d f(x)}{d x} \triangleq f'\) và \(\frac{d f(g(x))}{d g(x)} \triangleq f'(g)\):
Tổng đạo hàm:
Đạo hàm của phân số: $\((\frac{f}{g})' = \frac{f'g - fg'}{g^2}\)$
Đạo hàm tích (Product rule):
Đạo hàm hàm hợp (Chain rule):
2.3. Khai triển taylor¶
Là một trong những công thức nền của giải tích vi phân, khai triển taylor cho phép ta chứng minh được nhiều công thức quan trọng trong đó có công thức khai triển hàm \(\sin x, \cos x, \)e^{x}, \dots$ và rất nhiều các hàm số khác. Vậy khai triển taylor là gì?
Khai triển taylor là một công thức cho phép chúng ta tính toán giá trị của hàm số thông qua các giá trị đạo hàm bậc cao của nó. Cụ thế nếu hàm \(f(x): \mathbb{R} \mapsto \mathbb{R}\). Khi đó khai triển taylor của hàm \(f(x)\) có dạng:
Thành phần cuối cùng là hàm \(o((x-x_0)^{n})\) là một hàm \(o\) nhỏ của \((x-x_0)^n\). Giá trị của hàm này có tỷ số so với \((x-x_0)^{n}\) là bị chặn. Tức là với mọi giá trị \(\epsilon > 0\) tuỳ ý (có thể rất nhỏ), luôn tồn tại một giá trị \(N\) sao cho: \(|o((x-x_0)^n)| < \epsilon (x-x_0)^n\), \(\forall x > N\). Hay nói cách khác: \(\lim_{x \rightarrow x_0} \frac{o((x-x_0)^n)}{(x-x_0)^n} = 0\). Viết một cách ngắn gọn thì khai triển taylor có dạng:
Ngoài ra ta từ khai triển taylor cũng cho phép ta chứng minh được công thức đạo hàm ở \((1)\). Bởi các nếu chỉ khai triển đến bậc nhất ta có:
Dòng thứ 2 là vì \(\lim_{x \rightarrow x_0} \frac{o(x-x_0)}{x-x_0}=0\)
2.4. Đạo hàm riêng¶
Đối với một hàm số có đầu vào nhiều thì đạo hàm riêng sẽ được tính dựa trên từng chiều của hàm số đó. Chẳng hạn hàm \(f(x_1, \dots, x_n)\) sẽ có đạo hàm riêng theo \(x_i\) như sau:
Ta coi như các chiều còn lại khác \(x_i\) là hằng số và đạo hàm theo chỉ \(x_i\).
Công thức đạo hàm riêng sẽ được sử dụng để tính gradient descent.
2.5. gradient descent¶
Gradient descent là đạo hàm của một hàm số theo một véc tơ. Đây là một công thức thường xuyên được sử dụng trong huấn luyện và cập nhật hệ số của mạng nơ ron. Bởi chúng ta hình dung mạng neural network sẽ tìm cách tối ưu hàm loss function theo các véc tơ hệ số ở từng layer. Do đó chúng ta cần tính gradient descent của hàm loss function theo véc tơ hệ số.
Lưu ý đây là véc tơ cột vì có dấu chuyển vị.
Trong véc tơ gradient thì mỗi thành phần \(\frac{d f(w_i)}{d w_i}\) là đạo hàm riêng của hàm \(f(\mathbf{w})\) theo chiều \(w_i\)
2.3. Công thức đạo hàm vector-value¶
Có những véc tơ mà mỗi phần tử của nó là một hàm đối với biến \(x\). Ví dụ \(\mathbf{f}(x) = [f_1(x), f_2(x), \dots, f_n(x)]\). Khi đó đạo hàm của véc tơ cũng chính bằng đạo hàm của từng thành phần theo biến \(x\).
2.6. Đạo hàm vector-vector¶
Đạo hàm của một véc tơ hàm số \(\mathbf{f(x)} = [f_1(x), \dots, f_n(x)]\) theo vector \(\mathbf{x} = [x_1, \dots, x_m]\) chính là ma trận Jacobian.
Ở công thức dòng thứ hai thì \(\nabla f_i(\mathbf{x})\) chính là một véc tơ cột và là gradient descent của hàm số \(f_i\) theo véc tơ \(\mathbf{x}\).
2.7. Lan truyền thuận (feed forward)¶
Mạng nơ ron network có kiến trúc gồm nhiều layer, mỗi layer bao gồm các unit node có tác dụng tính toán ra một chiều của dữ liệu tại layer đó.
Hình 1: Kiến trúc mạng nơ ron với hai layers. \(x_1, x_2, x_3\) là các biến đầu vào, \(\mathbf{W}\) là ma trận hệ số có \(\mathbf{w}_{ij}\) là kết nối từ input thứ \(j\) tới output là node thứ \(j\). \(b_2\) đại diện cho hệ số của giá trị mở rộng \(1\). \(f(h_i)\) chính là hàm số activation để tạo ra tính phi tuyến và tạo ra \(u_i\). Những giá trị \(u_i\) này được dùng để tính \(s\).
Lan truyền thuận là quá trình từ input tính ra phân phối xác suất ở output. Ta có thể tóm tắt các bước tính lan này theo tuần tự công thức:
Xuất phát từ input : \(x\)
Tính layer 1: \(z = \mathbf{W}x + \mathbf{b}\)
Tính activation: \(\mathbf{h} = f(z)\)
Tính output: \(s = \mathbf{u}^{\intercal}\mathbf{h}\)
Các bước tính toán này có thể được tóm lược trong một sơ đồ.
Xuất phát từ \(x\), các node \(\odot\) là đại diện cho phép nhân và \(\oplus\) đại diện cho phép cộng. Chiều của mũi tên thể hiện thứ tự tính toán.
2.8. Chain rule trong lan truyền ngược backpropagation¶
Quá trình backpropagation sẽ thực hiện tính toán gradient descent và cập nhật hệ số. Bước này nói một cách hoa mỹ có thể coi như _linh hồn _ của quá trình huấn luyện. Công thức lan truyền ngược backpropagation sẽ thực hiện hai việc:
Tính toán gradient descent tại mỗi layers theo chiều từ cuối trở về đầu tiên. Vậy nên công thức này mới có tên gọi là backpropagation.
Cập nhật gradient descent tại mỗi layer theo giá trị được tính ở trên.
Chain rule trong backpropagation.
Công thức chain rule sẽ được ứng dụng rất nhiều trong backpropagation. Chẳng hạn như trong sơ đồ trên, các node và mũi tên màu xanh dương sẽ đi ngược chiều với mũi tên màu đen là đại diện cho backpropagation.
Giả sử ta xét qúa trình backpropagation tại một node cụ thể \(\mathbf{h} = f(z)\).
Để tính đạo hàm \(\frac{\delta s}{\delta z}\) ta sẽ không tính được trực tiếp mà phải thông qua chain rule: $\(\frac{\delta s}{\delta z} = \frac{\delta s}{\delta \mathbf{h}} \frac{\delta \mathbf{h}}{\delta z}\)$
Những gradient được thực hiện tại node đó gọi là local gradient, gradient ở phía liền sau node là downstream gradient và phía trước node là upstream gradient. Công thức trên có thể gói gọn lại thành
2.9. Một số công thức đạo hàm đáng nhớ¶
\(\mathbf{A}\) là một ma trận và \(\mathbf{x}\) là một véc tơ. Khi đó
Đạo hàm của tích ma trận với véc tơ:
Đạo hàm của tích véc tơ với ma trận:
Đạo hàm của tích hai véc tơ
Đạo hàm của tích véc tơ nhân với ma trận và nhân với véc tơ đó nhưng chuyển vị. $\(\nabla_{\mathbf{x}} \mathbf{x}^\top \mathbf{A} \mathbf{x} = (\mathbf{A} + \mathbf{A}^\top)\mathbf{x}\)$
Đây là những công thức quan trọng mà các bạn cần ghi nhớ.
3. Bài tập¶
Tính các đạo hàm sau:
\(\frac{1}{1+e^x}\)
\(\ln (x^2+1)\)
\(\sqrt{x+1}+x\)
\(\frac{\sin(x)}{\sqrt{x+1}}\)
Với \(\mathbf{A}\) là ma trận, \(\mathbf{w}\) là véc tơ. Tính: \(\nabla_{\mathbf{w}} ||\mathbf{Aw}-\mathbf{y}||^{2}\).
\(\nabla_{\mathbf{w}}^{2} ||\mathbf{Aw}-\mathbf{y}||^{2}\)
\(\nabla_{\mathbf{x}}\mathbf{a^{\intercal}\mathbf{x}^{\intercal}\mathbf{x}\mathbf{b}}\)
Thực hiện khai triển taylor với lần lượt các hàm số \(e^{x}, \sin(x), \cos(x)\)
https://web.stanford.edu/class/cs224n/slides/cs224n-2020-lecture04-neuralnets.pdf
https://d2l.aivivn.com/chapter_preliminaries/calculus_vn.html#dao-ham-rieng
https://en.wikipedia.org/wiki/Matrix_calculus