<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on</title><link>http://knoverse.io.vn/posts/</link><description>Recent content in Posts on</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>&lt;a href="http://knoverse.io.vn/" target="_blank" rel="noopener"&gt;Khanh&lt;/a&gt;</copyright><lastBuildDate>Mon, 21 Jul 2025 00:00:00 +0000</lastBuildDate><atom:link href="http://knoverse.io.vn/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Self-Attention và Multi-head Sefl-Attention trong Transformers</title><link>http://knoverse.io.vn/posts/2024/12/self-attention-v%C3%A0-multi-head-sefl-attention-trong-transformers/</link><pubDate>Sat, 21 Dec 2024 00:00:00 +0000</pubDate><guid>http://knoverse.io.vn/posts/2024/12/self-attention-v%C3%A0-multi-head-sefl-attention-trong-transformers/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Note: Có thể xem bài viết trên viblo &lt;a href="https://viblo.asia/p/self-attention-va-multi-head-sefl-attention-trong-transformers-n1j4lO2aVwl"&gt;ở đây&lt;/a&gt;. Nếu thấy hay cho mình xin upvote. Cảm ơn !&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Transformers&lt;/strong&gt; là gì? Liệu nó có gì đặc biệt mà trong machine learning người ta nhắc đến nó nhiều như thế? Trước thời điểm Google giới thiệu bài báo nổi tiếng &lt;a href="https://arxiv.org/abs/1706.03762v7"&gt;Attention Is All You Need&lt;/a&gt; thì transformers là &amp;ldquo;Người máy biến hình&amp;rdquo; là &amp;ldquo;Máy biến áp&amp;rdquo;. Sau khi bài báo được công bố thì transformers lại trở thành một trong những kiến trúc nổi bật trong lĩnh vực xử lý ngôn ngữ tự nhiên (NLP) và xử lý ảnh. Với khả năng xử lý song song và nắm bắt các mối quan hệ phức tạp giữa các từ trong câu, transformers đã giải quyết các hạn chế của mạng RNN và các biến thể (LSTM, GRU&amp;hellip;). Xương sống của kiến trúc này chính là cơ chế &lt;strong&gt;self-attention&lt;/strong&gt; giúp mô hình tập trung vào các thông tin quan trọng, hiệu quả hơn trong việc hiểu ngữ cảnh của từng từ trong câu và cho phép các transformers có bộ nhớ cực kỳ dài hạn. Có thể ví transformers như là 1 hộp đen, trong một ứng dụng dịch máy, nó sẽ &amp;ldquo;ngậm&amp;rdquo; vào một câu trong một ngôn ngữ và &amp;ldquo;thổi&amp;rdquo; ra bản dịch của nó trong một ngôn ngữ khác.&lt;/p&gt;</description><content type="html"><![CDATA[<blockquote>
<p>Note: Có thể xem bài viết trên viblo <a href="https://viblo.asia/p/self-attention-va-multi-head-sefl-attention-trong-transformers-n1j4lO2aVwl">ở đây</a>. Nếu thấy hay cho mình xin upvote. Cảm ơn !</p>
</blockquote>
<p><strong>Transformers</strong>  là gì?  Liệu nó có gì đặc biệt mà trong machine learning người ta nhắc đến nó nhiều như thế?  Trước thời điểm Google giới thiệu bài báo nổi tiếng <a href="https://arxiv.org/abs/1706.03762v7">Attention Is All You Need</a>  thì transformers là &ldquo;Người máy biến hình&rdquo;  là &ldquo;Máy biến áp&rdquo;. Sau khi bài báo được công bố thì transformers lại trở thành một trong những kiến trúc nổi bật trong lĩnh vực xử lý ngôn ngữ tự nhiên (NLP) và xử lý ảnh. Với khả năng xử lý song song và nắm bắt các mối quan hệ phức tạp giữa các từ trong câu, transformers đã giải quyết các hạn chế của  mạng RNN và các biến thể (LSTM, GRU&hellip;). Xương sống của kiến trúc này chính là cơ chế <strong>self-attention</strong> giúp mô hình tập trung vào các thông tin quan trọng, hiệu quả hơn trong việc hiểu ngữ cảnh của từng từ trong câu và cho phép các transformers có bộ nhớ cực kỳ dài hạn. Có thể ví transformers như là 1 hộp đen, trong một ứng dụng dịch máy, nó sẽ &ldquo;ngậm&rdquo; vào một câu trong một ngôn ngữ và &ldquo;thổi&rdquo; ra bản dịch của nó trong một ngôn ngữ khác.</p>
<p><img src="https://images.viblo.asia/83c2de57-749e-47fc-8911-ea118488d19b.png" alt="image.png"></p>
 <div align="center">Source: Attention Is All You Need</div>
<h3 id="1-self-attention-là-gì">1. Self-Attention là gì?</h3>
<p>Như chúng ta đã biết, <strong>Word Embedding</strong> là vector đại diện cho ngữ nghĩa của một từ trong câu. Trong bước tiền xử lý, chúng ta đã tạo ra một <strong>không gian vector</strong> chứa các vector embedding của các từ. Những từ có nghĩa tương tự nhau sẽ có vector ở gần nhau trong không gian đó và ngược lại. Tuy nhiên, ý nghĩa của các từ riêng lẻ trong một câu không thể đại diện cho toàn bộ ý nghĩa của câu đó. Chẳng hạn, trong câu &ldquo;The apple on the table&rdquo;, từ &ldquo;apple&rdquo; trong ngữ cảnh này được hiểu là quả &ldquo;táo&rdquo; . Nhưng nếu đặt trong một ngữ cảnh khác, như trong câu &ldquo;The Apple keynote was interesting&rdquo;, từ &ldquo;Apple&rdquo; có thể ám chỉ đến công ty công nghệ.</p>
<p>Cơ chế Self-Attention được đề xuất trong bài báo <a href="https://arxiv.org/abs/1706.03762v7">Attention Is All You Need</a>  có thể giải quyết tốt vấn đề này. Ý tưởng của nó là so sánh các từ với nhau đôi một, bao gồm cả chính nó (self), để tìm ra mức độ quan trọng của mỗi từ mà mô hình nên chú ý tới (thể hiện qua trọng số). Điều này giúp mô hình hiểu đúng ý nghĩa của từ trong ngữ cảnh cụ thể, thay vì chỉ dựa vào ý nghĩa tổng quát của từ đó khi đứng riêng lẻ.</p>
<h3 id="2-cơ-chế-hoạt-động-của-self-attention">2. Cơ chế hoạt động của Self-Attention.</h3>
<h4 id="21-attention-trong-seq2seq">2.1 Attention trong seq2seq.</h4>
<p>Quay lại với bài toán dịch máy, nếu chúng ta chỉ dịch từng từ ở ngôn ngữ này sang ngôn ngữ khác bằng cách ánh xạ word-by-word , thì đó quả là một phương pháp tệ, thiếu hiệu quả do không học được thông tin từ những từ xung quanh.</p>
<p><img src="https://images.viblo.asia/1a0f8f6d-5bc1-4ad9-bceb-f27da138bb6d.png" alt="image.png"></p>
 <div align="center">Source: Google Image</div>
<p>Mô hình seq2seq đã giới thiệu cơ chế attention. Trong cơ chế này, những từ đích được &ldquo;chú ý&rdquo; với các từ trong câu nguồn nhằm xác định xem mối quan hệ.Mỗi từ sẽ được biểu diễn dưới dạng vector embedding và có nhiều cách để tính toán &ldquo;score attention&rdquo;. Ở đây, chúng ta sẽ sử dụng tích vô hướng (dot product). Hai từ có ngữ nghĩa càng tương đồng thì tích vô hướng vector embedding của chúng càng lớn (trong trường hợp này score attention càng cao ). Với mỗi từ đích , chúng ta tính tích vô hướng với tất cả các từ trong câu nguồn. Sau khi tính toán, chúng ta thu được một vector chứa các &ldquo;score attention&rdquo;. Kết quả này được đưa qua hàm softmax để chuẩn hóa, từ đó xác định từ đích nên &ldquo;chú ý&rdquo; bao nhiêu phần trăm đến các từ  trong câu nguồn.</p>
<p><img src="https://images.viblo.asia/36dac19d-210c-4775-8a57-a4446b822626.png" alt="image.png">   <div align="center">Source: ProtonX</div></p>
<p>Giả sử dịch câu &ldquo;<strong>Tôi rất thích ăn cơm nếp</strong>&rdquo;  sang tiếng anh và ta có vector embedding của các từ trên:</p>
<ul>
<li><code>tôi: [-0.124, 0.067, -0.089]</code>,</li>
<li><code>rất: [0.156, -0.112, 0.078]</code>,</li>
<li><code>thích: [-0.082, 0.145, -0.167]</code>,</li>
<li><code>ăn: [0.134, -0.156, 0.112]</code>,</li>
<li><code>cơm: [-0.167, 0.089, -0.134]</code>,</li>
<li><code>nếp: [0.112, -0.145, 0.091]</code>,</li>
<li><code>s1: [0.23, 0.34, 0.45]</code>,</li>
</ul>
<p><strong>Tính score attention:</strong>
$$
e^1 =  s_1\begin{bmatrix}
| &amp; |&amp;|&amp;|&amp;|&amp;| \\
h_1 &amp; h_2 &amp;h_3&amp; h_4&amp; h_5&amp; h_6 \\
| &amp; |&amp;|&amp;|&amp;|&amp;|
\end{bmatrix}
$$
$$
= [0.23, 0.34, 0.45] \begin{bmatrix}
-0.124 &amp; 0.156 &amp; -0.082 &amp; 0.134 &amp; -0.167 &amp; 0.112 \\
0.067 &amp; -0.112 &amp; 0.145 &amp; -0.156 &amp; 0.089 &amp; -0.145 \\
-0.089 &amp; 0.078 &amp; -0.167 &amp; 0.112 &amp; -0.134 &amp; 0.091
\end{bmatrix}
$$
$$
= [-0.04579,  0.0329,  -0.04471,  0.02818, -0.06845,  0.01741]
$$</p>
<p><strong>sortmax</strong>:
$$
\alpha^1 =
\frac{\exp(e^1)}{\sum_{i=1}^{d_{e^1}} \exp({e^1}_i)} = [0.16122379, 0.174423  , 0.161398  , 0.17360166, 0.15761154,
0.17174201]
$$</p>
<p>kết quả này cho ta thấy <code>s1</code> &ldquo;chú ý&rdquo; đến các từ trong câu nguồn là như nhau .</p>
<h4 id="22-chi-tiết-về-self-attention">2.2 Chi tiết về Self-Attention.</h4>
<p>Điểm khác biệt với cơ chế attention ở trên với self attention là ngoài &ldquo;chú ý&rdquo; với các từ xung quanh thì nó còn &ldquo;tự chú ý&rdquo; với chính nó. Để làm gì nhỉ? Tại sao lại cần &ldquo;tự chú ý&rdquo; với chính nó?.</p>
<p>Xét câu &ldquo;<strong>Tôi cảm  thấy tôi không được khoẻ.</strong>&rdquo; self-attention với khả năng &ldquo;chú ý đến chính nó&rdquo; giúp mô hình nhận ra sự liên quan giữa hai lần xuất hiện của từ &ldquo;tôi&rdquo; . Mô hình sẽ phân biệt được rằng cả hai lần &ldquo;tôi&rdquo; đều chỉ cùng một chủ thể, đồng thời cũng nắm bắt được cấu trúc câu.
Hay trong  câu <strong>&ldquo;Tôi đọc sách của tôi.&rdquo;</strong>  trong câu này, từ &ldquo;tôi&rdquo; cũng xuất hiện hai lần và lại có ngữ nghĩa liên quan đến chính người nói. Nhưng khi từ &ldquo;Tôi&rdquo; tự &ldquo;chú ý&rdquo; đến chính nó thì mô hình sẽ hiểu đây là chủ ngữ và thực hiện hành động đọc nhằm phân biệt với từ  &ldquo;tôi&rdquo; thứ 2 không phải là chủ ngữ.
Lúc này việc tự &ldquo;chú ý&rdquo; đến nó giúp mô hình hiểu ngữ cảnh một cách chính xác.  Ngoài ra nó còn giúp giữ lại ngữ nghĩa cho từ, việc tự chú ý cho phép mỗi từ giữ lại ngữ nghĩa riêng của nó. Ví dụ, từ &ldquo;tôi&rdquo; khi xuất hiện lần thứ hai sẽ &ldquo;nhớ&rdquo; lại rằng nó đại diện cho người sở hữu cuốn sách, trong khi vẫn hiểu rõ rằng &ldquo;Tôi&rdquo; đầu tiên là chủ thể thực hiện hành động đọc.</p>
<p>Tóm lại, việc tự &ldquo;chú ý &quot; đến chính nó trong self-attention là cần thiết để mô hình giữ được ngữ nghĩa nguyên bản của từ và phân biệt chính xác các mối quan hệ ngữ cảnh trong câu, đặc biệt trong các cấu trúc phức tạp và câu có từ lặp lại.</p>
<p>Vậy tại sao attention trong seq2seq lại không tự &ldquo;chú ý&rdquo; đến chính nó. Đơn giản là seq2seq  thường sử dụng RNN hoặc LSTM cho encoder và decoder, do đó thông tin được truyền tuần tự từ trái sang phải trong chuỗi và không có sự tương tác trực tiếp giữa các từ đầu ra tại cùng thời điểm. Điều này khác với self-attention, nơi các từ có thể tương tác với nhau ngay tại encoder hoặc decoder để tạo ngữ cảnh toàn diện hơn.</p>
<blockquote>
<p><strong>Positional Encoding?</strong></p>
</blockquote>
<p>Transformers xử lý tất cả các embedding cùng một lúc. Điều này giúp Transformer nhanh hơn nhiều, nhưng lại làm mất đi thông tin liên quan đến thứ tự của các từ trong câu. Để giải quyết vấn đề này, các tác giả của bài báo &ldquo;Attention is All You Need&rdquo; đã giới thiệu khái niệm positional encoding (trong bài viết này, chúng ta sẽ không đi sâu vào chi tiết). Có thể hiểu rằng: mỗi từ trong câu sẽ được gán một vector đánh dấu vị trí của nó. Vector này sẽ được cộng vào embedding của từng từ, từ đó tạo ra một vector mới dùng làm đầu vào cho mô hình. Cách làm này giúp mô hình không chỉ nhận diện nội dung của từ mà còn hiểu được vị trí của nó trong ngữ cảnh của câu, từ đó cải thiện khả năng xử lý ngữ nghĩa của toàn bộ đoạn văn.</p>
<p><img src="https://images.viblo.asia/51d9523a-0a80-4975-bf5f-7ef1c833f41e.png" alt="image.png"></p>
 <div align="center">Source: Google Image</div>
<p>Bây giờ, chúng ta sẽ cùng đi sâu vào cách self-attention hoạt động. Đầu tiên, hãy xem cách tính self-attention bằng cách sử dụng các vector, sau đó sẽ chuyển sang cách cài đặt thực tế với các ma trận. Trước tiên, chúng ta cần làm rõ ba vector q (query), k (key), và v (value) là gì.</p>
<p><img src="https://images.viblo.asia/1f40ea9d-96a4-4d02-ab4f-0ce9a0fcacab.png" alt="image.png"></p>
 <div align="center">Source: Google Image</div>    
<p>Giống như tên gọi của chúng, hãy tưởng tượng bạn tìm kiếm một từ khóa trên Google. Từ khóa mà bạn nhập vào được xem là q (query), các kết quả xuất hiện là k (key), và nội dung trong các kết quả đó là v (value). Để tìm ra kết quả khớp nhất, ta cần đo lường mức độ tương đồng giữa q và k. Để thực hiện điều này, self-attention sử dụng tích vô hướng giữa các vector.</p>
<p>Sau khi xác định được các vector đầu vào, ta sẽ nhân từng vector với ba ma trận trọng số W_Q, W_K, Q_V để thu được các vector q, k, và v đã biến đổi. Thêm một câu hỏi đặt ra là: Tại sao chúng ta phải nhân các vector này với các ma trận trọng số? Chắc chắn là không phải làm cho vui rồi :)  .Việc này không chỉ để giảm chiều vector đầu vào, giúp tối ưu hóa tính toán, mà quan trọng hơn, việc nhân với ma trận trọng số cho phép mô hình có thể học và cập nhật các trọng số này trong quá trình huấn luyện. Giúp mô hình cải thiện độ chính xác của self-attention trong các lần tính toán tiếp theo.</p>
<p>Kích thước của các ma trận trọng số được tính như sau:</p>
<ul>
<li>Ma trận trọng số W_q: có kích thước d_q x d_model</li>
<li>Ma trận trọng số W_k: có kích thước d_k x d_model</li>
<li>Ma trận trọng số W_v: có kích thước d_q x d_model</li>
</ul>
<p>Trong đó:</p>
<ul>
<li>d_model là kích thước của mỗi vector đầu vào</li>
<li>d_q, d_k là kích thước của các vector truy vấn (query) và khóa (key) d_q = d_k</li>
<li>d_v là kích thước của vector giá trị (value)  và có thể khác với d_q và d_k.</li>
<li>trong bài báo Attention Is All You Need họ chọn chiều d_q = d_k = d_v = d_model / h (h là số lượng đầu (heads) trong cơ chế multi-head attention.)</li>
</ul>
<p><img src="https://images.viblo.asia/f94d9456-9864-4795-9e58-a653201d919a.png" alt="image.png">
<div align="center">Source: Google image</div></p>
<p>Trong ví dụ trên 2 từ &ldquo;Thinking&rdquo; và &ldquo;Machines&rdquo; sau khi cộng embedding với positional encoding tương ứng ta thu được 2 vector đầu vào là x1và x2.
Sau khi nhân lần lượt với các ma trận trọng số W_q, W_k, W_v ( các ma trận này ban đầu được khởi tạo ngẫu nhiên) ta được lần lượt các vector q1, k1, v1 cho từ &ldquo;Thinking&rdquo; và q2,k2,v2 cho từ &ldquo;Machines&rdquo;.</p>
<p>Bước thứ hai để tính self-attention là tính điểm, với từ “Thinking”. Ta cần tính điểm cho mỗi từ trong câu đầu vào so với từ này. Điểm sẽ quyết định cần chú ý bao nhiêu vào các phần khác của câu đầu vào khi ta đang mã hóa một từ cụ thể.</p>
<p>Điểm được tính bằng phép nhân vô hướng giữa véc tơ truy vấn q với véc tơ khóa k của từ mà ta đang tính điểm. Nếu ta tiến hành self-attention cho từ ở vị trí thứ nhất, điểm đầu tiên sẽ là tích vô hướng của q1 và k1. Điểm thứ hai là tích vô hướng của q1 và k2.</p>
<p><img src="https://images.viblo.asia/19e35dd8-b162-4b7f-b100-2c7f61588d5b.png" alt="image.png">
<div align="center">Source: Google image</div></p>
<p>Bước tiếp theo chúng ta cần <strong>Scale</strong>. Chia điểm cho 8 (căn bậc hai của số chiều của véc tơ khóa trong bài báo gốc – 64. Điều này giúp cho độ dốc ổn định hơn. Có thể có các giá trị khả dĩ khác, nhưng đây là giá trị mặc định), và truyền kết quả qua một phép softmax. Softmax chuẩn hóa các điểm để chúng là các số dương có tổng bằng 1.</p>
<p><img src="https://images.viblo.asia/25838b48-7ebb-4891-be6a-8747f0f9ef8f.png" alt="image.png">
<div align="center">Source: Google image</div></p>
<p>Điểm softmax sẽ quyết định mỗi từ sẽ được thể hiện nhiều hay ít tại vị trí hiện tại. Rõ ràng là từ tại vị trí này sẽ có điểm softmax cao nhất, nhưng đôi khi, chú ý đến các từ khác là cần thiết để hiểu từ hiện tại.</p>
<p>Tiếp theo nhân mỗi véc tơ v (value) với điểm softmax (trước khi cộng chúng lại). Một cách trực giác, việc nhân vector v (value) với các giá trị sortmax này giúp  bảo toàn giá trị của các từ mà ta muốn chú ý và bỏ qua các từ không liên quan (nhân chúng với một số rất nhỏ, ví dụ 0.001).</p>
<p>Cuối cùng là cộng các véc tơ v ( value ) đã được nhân trọng số. Kết quả chính là đầu ra của lớp self-attention tại vị trí hiện tại (từ đầu tiên trong ví dụ của ta).
Để minh họa ta giả sử từ vector v (value) của 2 từ &ldquo;Thinking&rdquo; là và &ldquo;Machines&rdquo; như sau:</p>
<ul>
<li>Vector <code>v1</code> của từ &ldquo;Thinking&rdquo; là <code>[1, 0.5, 0.3]</code></li>
<li>Vector <code>v2</code> của từ &ldquo;Machines&rdquo; là <code>[0.2, 0.4, 0.6]</code></li>
</ul>
<p>Sau khi tính toán softmax, ta có:</p>
<ul>
<li>Điểm softmax cho &ldquo;Thinking&rdquo; chú ý vào chính nó là <code>0.88</code></li>
<li>Điểm softmax cho &ldquo;Thinking&rdquo; chú ý vào &ldquo;Machines&rdquo; là<code> 0.12</code></li>
</ul>
<p>Bây giờ, chúng ta nhân các điểm softmax này với các vector v tương ứng:</p>
<ul>
<li>Với &ldquo;Thinking&rdquo; chú ý vào chính nó:
<ul>
<li>[1, 0.5, 0.3] * 0.88 = [0.88, 0.44, 0.264]</li>
</ul>
</li>
<li>Với &ldquo;Thinking&rdquo; chú ý vào &ldquo;Machines&rdquo;:
<ul>
<li>[0.2, 0.4, 0.6] * 0.12 = [0.024, 0.048, 0.072]</li>
</ul>
</li>
</ul>
<p>Cuối cùng, ta cộng hai vector này lại để có được đầu ra tổng hợp cho từ &ldquo;Thinking&rdquo;:</p>
<ul>
<li>[0.88,0.44,0.264]+[0.024,0.048,0.072]=[0.904,0.488,0.336]</li>
</ul>
<p>Kết quả cuối cùng [0.904, 0.488, 0.336] là vector đầu ra của lớp self-attention cho từ &ldquo;Thinking&rdquo;. Vector này là một sự kết hợp có trọng số giữa các thông tin từ &ldquo;Thinking&rdquo; và &ldquo;Machines&rdquo;, nhưng trọng số của &ldquo;Thinking&rdquo; chiếm ưu thế hơn do điểm softmax cao hơn.</p>
<h5 id="tính-self-attention-bằng-ma-trận">Tính self-attention bằng ma trận</h5>
<p>Giả sử ta nhập vào một câu: “Hi, How are you?” và  muốn transformer của bạn xuất ra “I am fine”.
Sau khi xử lý embedding và positional encoding ta thư đuợc một ma trận đầu vào của các từ trên. Sau đó nhân với các ma trận trọng số W_q, W_k, W_v ta đuợc 3 ma trận Q, K, V.</p>
<p><img src="https://images.viblo.asia/72d59ca8-9b26-4a1b-b5c7-5effd0a8d8ad.png" alt="image.png"></p>
  <div align="center">souce: Attention Networks: A simple way to understand Self-Attention</div>
Tiếp theo ta nhân 2 ma trận Q và K với nhau để tính điểm tuơng đồng. VÌ Q và K cùng chiều nên ta chuyển vị ma trận K trước khi nhân.
<p><img src="https://images.viblo.asia/2932c846-eb7d-45c2-95fb-89803ded77e4.png" alt="image.png">
<div align="center">souce: Attention Networks: A simple way to understand Self-Attention</div>
Đầu ra của phép nhân này gọi là &ldquo;Attention filters&rdquo;. Thực hiện các bước tương tự như trên vector để tính đầu ra của lớp self-attention.</p>
<p><img src="https://images.viblo.asia/336c4bad-2407-44f3-836e-03f6f7766821.png" alt="image.png">
<div align="center">souce: Attention Networks: A simple way to understand Self-Attention</div></p>
<h3 id="3-multi-head-sefl-attention">3. Multi-head Sefl-Attention.</h3>
<p>Trong kiến trúc transformers phần mã hóa là một ngăn xếp encoder các encoder xếp chồng lên nhau (bài báo gốc sử dụng 6 encoder). Thành phần giải mã là một ngăn xếp decoder với cùng số lượng. Trong mỗi encoder người ta sử dụng nhiều  self attention còn được gọi là attention head thay vì chỉ một Cơ chế này cải thiện hiệu năng của lớp attention theo hai khía cạnh:</p>
<ol>
<li>Nó mở rộng khả năng của mô hình trong việc tập trung vào các vị trí khác nhau. Nếu chỉ sử dụng 1 self attention  việc tự &ldquo;chú ý&rdquo; vào chính nó  sẽ bị bởi chính thông tin của từ đó làm lấn át đi một số thông tin mã hóa từ các vị trí khác,</li>
<li>Nó mang lại cho lớp attention nhiều không gian con để biểu diễn. Với multi-headed attention chúng ta không chỉ có một mà nhiều bộ ma trận trọng số Query/Key/Value (Transformer sử dụng tám đầu attention, do đó ta sẽ có 8 bộ cho mỗi encoder/decoder). Mỗi bộ được khởi tạo ngẫu nhiên. Sau đó, kết thúc huấn luyện, mỗi bộ được dùng để phản ánh embedding đầu vào (hoặc véc tơ từ các encoder/decoder phía dưới) trong một không gian con riêng biệt.</li>
</ol>
<p><img src="https://images.viblo.asia/9c981e98-2420-415e-aecb-19d0bdf7fb78.png" alt="image.png">
<div align="center">Source:   <a href="https://arxiv.org/abs/1706.03762v7">Attention Is All You Need</a></div></p>
<p>Chúng ta hãy xem cách nó hoạt động trong khi Transformer giải quyết vấn đề dịch thuật. Chúng ta sẽ sử dụng một mẫu dữ liệu đào tạo bao gồm một chuỗi đầu vào (&lsquo;You are welcome&rsquo; trong tiếng Anh) và một chuỗi mục tiêu (&lsquo;De nada&rsquo; trong tiếng Tây Ban Nha).</p>
<ul>
<li>Kích thước embedding ở ví dụ này chúng ta đặt là 1x6 ( hay d_model = 6)</li>
<li>d_Q = d_K = d_V trong ví dụ này là 3</li>
<li>Số lượng Attention heads trong ví dụ này là 2</li>
</ul>
<p><img src="https://images.viblo.asia/752cc9a3-3e9d-4c10-9221-523a461be491.png" alt="image.png">
<div align="center">Source: <a href="https://towardsdatascience.com/transformers-explained-visually-part-3-multi-head-attention-deep-dive-1c1ff1024853">Multi-head Attention</a></div></p>
<div align="center">Như đã đề cập transformers sử dụng nhiều encoder và mỗi encoder có một hoặc nhiều self attention, hình trên sử dụng Dữ liệu đầu vào theo batch , để đơn giản chúng ta chỉ xét 1 mẫu dữ liệu đầu vào.</div>
<p><img src="https://images.viblo.asia/de5f7674-fae7-4fed-a9ca-a2cfeb80d5c0.png" alt="image.png">
<div align="center">Source: <a href="https://towardsdatascience.com/transformers-explained-visually-part-3-multi-head-attention-deep-dive-1c1ff1024853">Multi-head Attention</a></div>
<div align="center">Mẫu chúng ta sử dụng có kích thước là 4x6 sau khi đã thêm 1 lớp padding.</div></p>
<p>Bước tiếp là chúng ta cần chia dữ liệu thành nhiều head attention để mỗi head có thể xử lí riêng biệt.
Ở đây, việc chia chỉ là chia về mặt logic. Thực tế vector đầu vào không được phân chia vật lý thành các ma trận riêng biệt một cho mỗi head . Tương tự như vậy, không chia vật lý cho các ma trận W_Q, W_K, W_V, riêng biệt một cho mỗi head. Tất cả các head chia sẻ cùng một ma trận W_Q, W_K, W_Vớp Linear nhưng chỉ đơn giản là hoạt động trên phần logic &lsquo;riêng&rsquo; của của chúng. (Nếu chia vật lý, giả sử có n đầu thì có tới 3n ma trận trọng số việc này không hiệu qua trong quá trình cập nhật trọng số về sau).</p>
<p><img src="https://images.viblo.asia/6a6cce29-b8d4-45c7-a6ab-a58995593576.png" alt="image.png">
<div align="center">Source: <a href="https://towardsdatascience.com/transformers-explained-visually-part-3-multi-head-attention-deep-dive-1c1ff1024853">Multi-head Attention</a></div></p>
<p>Tiếp theo chúng ta cần tính toán chiều của các ma trận W_Q, W_K, W_V cho mỗi head.</p>
<ul>
<li>Kích thước trước khi chia của mỗi W_Q, W_K, W_V làm emb_size x emb_size ( chọn kích thước này để chiều của Q, K , V cùng chiều cới vector đầu vào)emb_size</li>
<li>Kich thước của W_Q, W_K, W_V khi chia cho mỗi đầu  =  emb_size) x (d_q x heads)</li>
</ul>
<p><img src="https://images.viblo.asia/803f7e7f-a46e-4edd-a8bf-e8d1aa53dd74.png" alt="image.png"></p>
<p>Mặc ma trân W_Q là một ma trận duy nhất, chúng ta có thể coi nó như là &lsquo;xếp chồng&rsquo; các W_Q của mỗi head .</p>
<p><img src="https://images.viblo.asia/1927cf06-5ed1-440b-9369-9ad83319a8c9.png" alt="image.png"></p>
<p>Bây giờ chúng ta cần định hình lại kích thước các ma trận Q,K, V. Ban đầu sau khi đi qua W_Q, W_K, W_V, các ma trận Q,K, V  của chúng ta có chiều seq x emb (số câu x số chiều mỗi từ) trong ví dụ này là 4 x 6. Vì có 2 head nên chia 2 phần theo chiều embedding để mỗi chiều xử lí thông tin của một từ. Giả sử ta có embedding của &ldquo;<strong>You are welcome</strong>&rdquo;</p>
<ul>
<li><code>You</code> : <code>[0.205, 0.352, 0.625, 0.256, 0.967, 0.423]</code></li>
<li><code>are</code> :     <code>[0.501, 0.750, 0.817, 0.609, 0.6057, 0.637]</code></li>
<li><code>welcome</code>:  <code>[0.080, 0.948, 0.696,  0.444, 0.376, 0.132]</code></li>
<li><code>PAD</code> : <code>[0. , 0. , 0. , 0. , 0. , 0. ]</code></li>
</ul>
<p>Chia các vector đầu vào này thành 2 phần tùy ý ( ở đây ta lấy mỗi phần có chiều là 3) cho mỗi đầu ta có :</p>
<ul>
<li>
<p>với head 1:</p>
<ul>
<li><code>You</code> : <code>[0.205, 0.352, 0.625]</code></li>
<li><code>are</code> :     <code>[0.501, 0.750, 0.817 ]</code></li>
<li><code>welcome</code>:  <code>[0.080, 0.948, 0.696]</code></li>
<li><code>PAD</code> : <code>[0. , 0. , 0.]</code></li>
</ul>
</li>
<li>
<p>với head 2:</p>
<ul>
<li><code>You</code> : <code>[0.256, 0.967, 0.423]</code></li>
<li><code>are</code> :     <code>[0.609, 0.6057, 0.637]</code></li>
<li><code>welcome</code>:  <code>[0.444, 0.376, 0.132]</code></li>
<li><code>PAD</code> : <code>[0. , 0. , 0.]</code></li>
</ul>
</li>
</ul>
<p><img src="https://images.viblo.asia/9ce6f054-e015-4f46-8031-6f55779f4e1d.png" alt="image.png"></p>
 <div align="center"> Trong ví dụ này Seq là số câu = 4 , Query Sz bằng số chiều embedding = 6 , Heads = 2.</div>
<p>Chà!!  việc chia như này tức là tạo ra các <strong>không gian vector riêng</strong>   ở đây có thể xem head 1 và head 2 là các không gian vector riêng biệt và các từ trong không gian đấy có mối quan hệ là khác nhau . Việc này giúp mỗi head tập trung vào một mối quan hệ riêng. Ví dụ &ldquo;Tôi thích ăn phở&rdquo; head 1 có thể tập trung vào mối quan hệ chủ ngữ-vị ngữ (&ldquo;Tôi&rdquo; - &ldquo;thích&rdquo;) trong khi đó head 2 có thể tập trung vào mối quan hệ vị ngữ-tân ngữ (&ldquo;thích&rdquo; - &ldquo;phở&rdquo;).</p>
<p>Tiếp theo chúng ta tính score attention và sortmax cho mỗi head giống như ta đã làm ở self attention .</p>
<p><img src="https://images.viblo.asia/7f76c7b5-3937-4f71-b897-ba26ce124378.png" alt="image.png"></p>
<p>Sau khi tính toán xong ở mỗi head, chúng ta cần ghép (concatenate) các kết quả từ các head lại với nhau theo từng câu. Kết quả này chính là đầu vào cho encoder kế tiếp.</p>
<p><img src="https://images.viblo.asia/a5b5249b-481d-4ac2-ba33-53ffcad666cd.png" alt="image.png"></p>
<h1 id="lời-kết">Lời kết.</h1>
<p>Self attention , mutil-head attention cùng với mô hình Transformer đã được thể hiện được sự hiệu quả của nó trong nhiều lĩnh vực đặc biệt trong NLP và xử lý ảnh . Trên đây là một số kiến thức mà mình tìm hiểu được . Vì kiến thức mình hạn hẹp nên rất mong sự đóng góp của mọi người. Cảm ơn các bạn đọc bài viết .</p>
<ul>
<li>
<h3 id="tài-liệu-tham-khảo-trong-bài-viết">Tài liệu tham khảo trong bài viết.</h3>
<ul>
<li><a href="https://arxiv.org/abs/1706.03762v7">Attention Is All You Need</a></li>
<li><a href="https://towardsdatascience.com/transformers-explained-visually-part-3-multi-head-attention-deep-dive-1c1ff1024853">Multi-head Attention</a></li>
<li><a href="https://medium.com/@geetkal67/attention-networks-a-simple-way-to-understand-self-attention-f5fb363c736d">Attention Networks: A simple way to understand Self-Attention</a></li>
<li><a href="https://pi-tau.github.io/posts/transformer/">https://pi-tau.github.io/posts/transformer/</a></li>
</ul>
</li>
</ul>
]]></content></item><item><title>Vector Gradient &amp; Directional Derivative</title><link>http://knoverse.io.vn/posts/2023/09/vector-gradient-directional-derivative/</link><pubDate>Fri, 15 Sep 2023 00:00:00 +0000</pubDate><guid>http://knoverse.io.vn/posts/2023/09/vector-gradient-directional-derivative/</guid><description>&lt;p&gt;Các thuật toán tối ưu hàm mất mát (loss function) phổ biến hiện nay như Gradient Descent hay Adam &amp;hellip; đã cho thấy tính hiệu quả trong quá trình huấn luyện mô hình. Các thuật toán này hoạt động bằng cách cập nhật trọng số (weight) theo hướng ngược lại với vector gradient. Tại sao lại phải là ngược hướng Vector Gradient?&lt;/p&gt;
&lt;h2 id="1-ordinary-derivativeđạo-hàm-thông-thường"&gt;1) Ordinary derivative(đạo hàm thông thường)&lt;/h2&gt;
&lt;p&gt;Đạo hàm cấp 1 của hàm một biến ($f: \mathbb{R} \to \mathbb{R}$) (ordinary derivative) tại điểm $x$ được định nghĩa là :
$$
f&amp;rsquo;(x) = \lim_{\Delta x \to 0} \frac{f(x - \Delta x) - f(x)}{\Delta x}
$$
Công thức trên khá quen thuộc trong chương trình THPT . Nó biểu thị tốc độ thay đổi của $f(x)$ khi $x$ thay đổi một lượng rất nhỏ là $\Delta x$. . Đối với đồ thị trên mặt phẳng tọa độ, đạo hàm tại một điểm trên đồ thị bằng độ dốc của đường tiếp tuyến với đồ thị tại điểm đó. Chính vì thế mới có nguyên tắc tìm tiếp tuyến của đồ thị tại một điểm bằng cách tính đạo hàm.&lt;/p&gt;</description><content type="html"><![CDATA[<p>Các thuật toán tối ưu hàm mất mát (loss function) phổ biến hiện nay như Gradient Descent hay Adam &hellip; đã cho thấy tính hiệu quả trong quá trình huấn luyện mô hình. Các thuật toán này hoạt động bằng cách cập nhật trọng số (weight) theo hướng ngược lại với vector gradient. Tại sao lại phải là ngược hướng Vector Gradient?</p>
<h2 id="1-ordinary-derivativeđạo-hàm-thông-thường">1) Ordinary derivative(đạo hàm thông thường)</h2>
<p>Đạo hàm cấp 1 của hàm một biến ($f: \mathbb{R} \to \mathbb{R}$) (ordinary derivative)  tại điểm $x$  được định nghĩa là :
$$
f&rsquo;(x) = \lim_{\Delta x \to 0}  \frac{f(x - \Delta x) - f(x)}{\Delta x}
$$
Công thức trên khá quen thuộc trong chương trình THPT . Nó biểu thị tốc độ thay đổi của $f(x)$ khi $x$  thay đổi một lượng rất nhỏ là $\Delta x$. . Đối với đồ thị trên mặt phẳng tọa độ, đạo hàm tại một điểm trên đồ thị bằng độ dốc của đường tiếp tuyến với đồ thị tại điểm đó. Chính vì thế mới có nguyên tắc tìm tiếp tuyến của đồ thị tại một điểm bằng cách tính đạo hàm.</p>
<p>$f&rsquo;(x)$  luôn cho ta một hàm thuộc không gian 1 chiều ($f: R \to R$) . Hướng của nó được quyết định bởi dấu của $f&rsquo;(x)$:</p>
<ul>
<li>Khi  $f&rsquo;(x) &gt; 0$, hàm số <strong>đang tăng</strong> khi ta đi từ trái sang phải (hướng dương).</li>
<li>Ngược lại $f&rsquo;(x)$ &lt; 0 hàm số <strong>đang giảm</strong> khi ta đi từ phải sang trái (hướng âm)</li>
</ul>
<p>Nó chỉ thể hiện được độ dốc khi đi theo trục $x$. Vậy với không gian nhiều chiều thì sao ?</p>
<h2 id="2-vector-gradient-directional-derivative">2) Vector Gradient, Directional Derivative</h2>
<p>Trong không gian nhiều chiều chúng ta cũng cần tính độ dốc tại một điểm, nhưng lúc này điểm đó có nhiều tọa độ (ví dụ $(x,y)$ trong không gian 3 chiều với bề mặt $z = f(x,y)$  và độ dốc phụ thuộc vào hướng mà bạn di chuyển)
Hãy tưởng tượng bạn đang đứng trên một sườn núi:</p>
<ul>
<li>Tại điểm mà bạn đang đứng nếu bạn bước sang ngang (theo đường đồng mức),độ dốc bằng 0 (giữ nguyên tọa độ $x, y$ thay đổi $z$)</li>
<li>Nếu bạn bước thẳng lên đỉnh núi độ dốc sẽ lớn nhất (dương).</li>
<li>Nếu bạn bước thẳng xuống chân núi , độ dốc cũng lớn nhất nhưng theo chiều âm.</li>
<li>Nếu bạn bước theo một hướng chéo, độ dốc sẽ có một giá trị nào đó ở giữa.</li>
</ul>
<p>Để giải quyết vấn đề này chúng ta có khái niệm Gradient (hay vector gradient)</p>
<h3 id="21-đạo-hàm-riêng-partial-derivative">2.1) Đạo hàm riêng (partial derivative)</h3>
<p><strong>Đạo hàm riêng (partial derivative</strong>) cũng hoạt động trên nguyên tắc của đạo hàm cấp một. Nhưng lúc này đạo hàm  <strong>được tính riêng cho từng biến</strong> và <strong>xem biến còn lại là hằng số</strong> .Ví dụ hàm:
$$f(x, y) = x^3y^2$$</p>
<p><img src="https://images.viblo.asia/e398bf0c-daec-44a3-8e4b-ede7f5b644e9.png" alt=""></p>
<ul>
<li>Đạo hàm hàm  $f$ theo biến $y$, lúc này  xem $x$ là hằng số. Ký hiệu  $\frac{ \partial(f)}{\partial(y)} = x^32y^3$</li>
<li>Đạo hàm hàm $f$ theo biến $x$, lúc này  xem $y$ là hằng số. Ký hiệu  $\frac{ \partial(f)}{\partial(x)} = 3x^2y^3$</li>
</ul>
<p>Khi xem $x$ là hằng số, ta sẽ dùng một mặt phẳng, chẳng hạn $x=1$, để cắt đồ thị $z=x^3y^2$ , để lại giao tuyến là đường $1^3y^2 = y^2$</p>
<p><img src="https://images.viblo.asia/36a6237f-75ba-4c1a-bced-ce7d1b0f92af.png" alt=""></p>
<p>Việc dùng đạo hàm riêng cho chúng ta biết khi giữ nguyên một biến và thay đổi biến còn lại thì hàm số thay đổi bao nhiêu.Để có được thông tin về tốc độ thay đổi của hàm, chúng ta cần biến được gữ nguyên và thay đổi biến nào và có giá trị giữ nguyên là bao nhiêu Sau đó thay các giá trị này vào.</p>
<p>Với ví dụ trên ta có đạo hàm riêng theo biến $y$ của đại lượng $z$ khi $x = 1$.Tại điểm $(1, 2)$ ta có đạo hàm riêng theo biến $y $là $2y = 2\times2 = 4$ .Tức tại điểm đó $(1, 2)$ nếu ta giữ nguyên $x$ và thay đổi $y$ một lượng nhỏ là $\partial(y)$ thì $z$ thay đổi lượng gấp 4 lần khi ta thay đổi $y$ hay ta viết  $\frac{\partial(z)}{\partial(y)}$  tại điểm đó là  $4$</p>
<h3 id="22-vector-gradient">2.2) Vector Gradient</h3>
<p>Thay vì tính đạo hàm riêng cho từng biến một cách riêng lẻ, chúng ta có thể sử dụng một đối tượng duy nhất gọi là <strong>vector gradient</strong>. Vector này tổng hợp tất cả thông tin về độ dốc (slope) của hàm số tại một điểm cụ thể, giúp quá trình tính toán trở nên hiệu quả hơn rất nhiều. Gradient của hàm $f(v)$ với $v = [v_1, v_2 &hellip; v_n]$ cũng là một vector ký hiệu là:
$$
\nabla{f} =
\begin{bmatrix} \frac{\partial(f)}{\partial(v_1)} \\  \frac{\partial(f)}{\partial(v_2)} \\ \frac{\partial(f)}{\partial(v_3)} \\ &hellip; \\ \frac{\partial(f)}{\partial(v_n)}
\end{bmatrix}
$$</p>
<p>Vector gradient có hai tính chất cực kỳ quan trọng, lý giải tại sao các thuật toán Gradient Descent lại cập nhật tham số (weights) theo hướng ngược lại với nó:</p>
<ul>
<li><strong>Hướng (Direction):</strong> Vector gradient luôn chỉ về <strong>hướng mà tại đó hàm số tăng nhanh nhất</strong> (hướng dốc nhất).</li>
<li><strong>Độ lớn (Magnitude):</strong> Độ lớn của vector gradient cho biết <strong>tốc độ tăng trưởng lớn nhất</strong> của hàm số theo hướng đó.</li>
</ul>
<p>Trong các bài toán học máy, mục tiêu của chúng ta là tối thiểu hóa hàm mất mát (loss function). Vì vector gradient chỉ ra hướng làm cho hàm số <em>tăng</em> nhanh nhất, nên để <em>giảm</em> giá trị của hàm mất mát, chúng ta cần di chuyển theo hướng ngược lại. Nguyên lý &ldquo;đi ngược lại hướng dốc nhất&rdquo; này chính là nền tảng cốt lõi của các thuật toán thuộc họ Gradient Descent.</p>
<p>Chúng ta sẽ chứng minh 2 tính chất trên vào cuối bài viết sau khi triển khai directional derivative.</p>
<h3 id="23-directional-derivativeđạo-hàm-theo-hướng">2.3) Directional derivative(đạo hàm theo hướng)</h3>
<p>Đạo hàm có hướng có nhiều ý nghĩa và chức năng khác nhau, trong bài này chỉ nói đến việc mô tả tốc độ thay đổi - độ dốc của hàm.</p>
<p>Đạo hàm có hướng là một dạng tổng quát của đạo hàm riêng. Nếu đạo hàm riêng chỉ có thể xét cho sự thay đổi của một biến thì đạo hàm có hướng xét sự thay đổi của nhiều biến.</p>
<p>Định nghĩa cơ bản nhất của đạo hàm theo hướng của hàm $f$ tại  điểm  $P(a, b)$ theo hướng của  vector đơn vị $u(u_{1},u_{2})$ là một giới hạn, tương tự như đạo hàm một biến:
$$
D_{u}(f(a,b)) = \lim_{h\to0} \frac{f(a+hu_{1}, b+hu_{2})- f(a,b)}{h}
$$</p>
<ul>
<li>$h$ ở đây thể hiện khoảng cách thay đổi rất nhỏ theo hướng của vector $u$.Tưởng tượng bạn đang leo lên một đỉnh núi .Tại vị trí bạn đứng có tọa độ là $P(a, b)$, bây giờ bạn muốn đang đi với hướng của vector đơn vị $u$ thì $h$ chính là khoảng cách mà bạn bước . Vector dịch chuyển $hu = (hu_{1},hu_{2})$, điểm mà bạn đến có tọa độ là $(a+hu_{1}, b+hu_{2})$</li>
</ul>
<p>Tính toán giới hạn trên thuờng rất phức tạp . Chúng ta cần một cách hiệu quả hơn.Hãy tưởng tượng bề mặt $z = f(x,y)$. Thay vì nhìn toàn bộ bề mặt ,chúng ta chỉ quan tâm đến những gì xảy ra dọc theo một đường thẳng đi qua điểm $P(a,b)$ theo hướng $u$.(tức là xem xét lát cắt chứa điểm đó và vector u thuộc 2 chiều )</p>
<p>Ta có thể định nghĩa đường thẳng này bằng tham số t:</p>
<ul>
<li>$x(t) = a + tu_1$</li>
<li>$y(t) = b + tu_2$</li>
</ul>
<p>Lúc này hàm $g(t) = f(x(t), y(t)) = f(a+tu_1, b+tu_2)$ là giá trị của f dọc theo đường thẳng này</p>
<p><img src="https://images.viblo.asia/ab870e45-da89-446d-9eb4-795cc2a91962.png" alt="image.png"></p>
<p>Hàm $g(t)$ là hàm một biến theo , $\frac{\Delta{g(t)}}{t}$  cho ta biết tốc độ thay đổi của $f$ dọc theo đường thẳng mà ta đã chọn.</p>
<p>Ta có:
$$
g&rsquo;(0) = \lim_{h \to 0}\frac{g(0+h) - g(0)}{h} = \lim_{h \to 0}\frac{g(h)-g(0)}{h} = \lim_{h \to 0} \frac{f(a+hu_1, b+hu_2)-f(a,b)}{h}=D_u{f(a,b)}
$$
Mặt khác áp dụng quy tắc chain rules cho hàm 2 biến ta có:
$$
g&rsquo;(t)=f&rsquo;(x(t),y(t))= f(a+tu_1, b+tu_2)= \frac{\partial{f}}{\partial{x}}\frac{d_x}{d_t} + \frac{\partial{f}}{\partial{y}}\frac{d_y}{d_t} =\frac{\partial{f}}{\partial{x}} u_1+ \frac{\partial{f}}{\partial{y}}u_2
$$</p>
<p>Ta có vector gradient là
$:
\Delta{f} =
\begin{bmatrix} \frac{\partial(f)}{\partial(x)} \  \frac{\partial(f)}{\partial(y)}
\end{bmatrix}$ hay $g&rsquo;(t)$ =  $\Delta{f}u$  vậy  $g&rsquo;(0)$= $\Delta{f(a, b)}u$. Nên ta có công thức tính <strong>đạo hàm  hướng</strong> của vector đơn vị u:
$$
D_u{f(a,b)} = \Delta{f(a,b)u}
$$</p>
<p><strong>Chứng minh 2 tính chất của vector gradient</strong>:</p>
<ul>
<li>Khi $f$ có độ dốc lớn nhất thì  $D_u{f}_ = \Delta{f.u}$ là lớn nhất với  $\Delta{f}$ và $u$ là 2 vector cùng chiều .Ta có công thức tính tích vô hướng của 2 vector :
$$
\Delta f \cdot u = |\Delta f| , |u| , \cos\theta
$$</li>
</ul>
<p>Do $u$ là vector đơn vị nên $|u|= 1$ khi đó:
$$\max (\Delta f \cdot u) =\max( |\Delta f| ,.\cos\theta)$$
Xảy ra khi $\Delta f{\max}$ là  và $\cos\theta=1$ hay <strong>Vector Gradient</strong> cùng hướng với $u$ và có độ lớn là $\max$</p>
<p><strong>Ý nghĩa</strong>: Đạo hàm có hướng là một dạng tổng quát của đạo hàm riêng. Nếu đạo hàm riêng chỉ có thể xét cho sự thay đổi của một biến thì đạo hàm có hướng xét sự thay đổi của nhiều biến.</p>
<p>Giả sử hàm $f: R^2 \to R$ nhóm các biến đầu vào thành một vector (khác với vector gradient là nhóm các đạo hàm riêng), tức là thay vì ghi $z = f(x, y)$ thì ghi $z = f(v)$ và ngầm hiểu rằng  $:
v =
\begin{bmatrix} x \  y
\end{bmatrix}$</p>
<p>Do có 2 biến $x, y$  nên không gian input  là 2 mặt phẳng và không gian output của hàm $f$ là một tia số. Hàm $f$ &ldquo;nối&rdquo; một điểm trong không gian input chiều sang một điểm trong không gian output</p>
<p>Giả sử có một vector  $w = (1, 3)$  chúng ta cầnchuẩn hóa nó thành vector đơn vị $u$ (vì vector đơn vị chỉ mang thông tin về hướng không quan trọng độ lớn ) . Vậy nếu chúng ta dịch chuyển điểm trong không gian input đi theo hướng của vector $u$ thì trong không gian output điểm đó bị đẩy đi bao nhiêu lần?
Quan sát hình sau. Hai điểm cùng màu là một bộ input-output tương ứng nhau cho hàm
$f$. Ví dụ ở bên trái, điểm màu đỏ
$(1,2)$ làm input thì sẽ cho điểm màu đỏ ở ảnh phải có giá trị
$f(x,y)=x^3y^2=4$. Bây giờ nếu trong hình trái, ta dời điểm màu đỏ sang vị trí điểm màu xanh theo hướng (chỉ hướng thôi nhé, còn khoảng cách được quyết định bởi $(h \to 0)$ của $w=(1,3)$, thì ở hình bên phải độ dời đó sẽ gấp bao nhiêu lần so với bên trái?</p>
<p><img src="https://images.viblo.asia/f3a38c25-b18f-4dc0-aa1e-45689d930c8d.png" alt="image.png"></p>
<p>Ta có :</p>
<p>$$
u= \frac{w}{|w|} = (\frac{1}{\sqrt{10}}, \frac{3}{\sqrt{10}})
$$</p>
<p>$$
\Delta_uf(v) = \Delta{f} . u = \frac{1}{\sqrt{10}} . (3x^2y^2) + \frac{3}{\sqrt{10}} . (2x^3y) =  \frac{1}{\sqrt{10}}.(3.1^2.2^2) +  \frac{3}{\sqrt{10}} . (2.1^3.2)
$$</p>
<p>Hay hình bên phải độ dời đó sẽ gấp $\frac{24}{\sqrt{10}}$ lần so với bên trái.<strong>Tại các điểm input cụ thể, ta có thể thay vào và tính ra được đạo hàm hướng tại điểm đó, còn gọi là tính độ dốc (slope).</strong></p>
]]></content></item></channel></rss>