@@ -29,8 +29,8 @@ self-attention을 수학적으로 동일하지만 Memory Efficient하게 구현
2929Attention은 기존의 RNN,GRU,LSTM 스타일의 encoder-decoder[ link] ( https://arxiv.org/pdf/1406.1078 ) 의 한계점을 보완하기 위해 나왔습니다.
3030Attention[[ link]] ( https://arxiv.org/pdf/1409.0473 ) 은 Dzmitry Bahdanau라는 분과 뉴옥대의 조경현 교수님께서 처음 제안하셨습니다.
3131
32- 조경현 교수님께서는 fixed size vector에 sequence vector를 압축하는것이 불가능하다고 결론을 내리셨습니다.
33- [[ link ]] ( https://www.boostcourse.org/ai331/lecture/540234?isDesc=false )
32+ 조경현 교수님께서는 fixed size vector에 sequence vector를 압축하는것이 불가능하다고 결론을 내리셨습니다.[[ link ]] ( https://www.boostcourse.org/ai331/lecture/540234?isDesc=false )
33+
3434![ rnn-attention] ( \assets\images\DeepLearning\KernelFusion\rnn-attention.png )
3535따라서, sequence vector를 fixed size로 압축해서 decoder의 input에 주지 않고 token length에 비례한 vector를 decoder에 input으로 주었습니다.
3636input sequence를 tokenize한 embedding vector들로 정보를 만들어야 합니다.
@@ -113,7 +113,6 @@ $$ = \sum_{j=1}^{S} e^{\,x_j - m_S} $$
113113
114114#### SafeNess
115115
116- ** SafeNess** :
117116- $$ m_j \in \Bigl[\min_{k=1}^V m_k,\; \max_{k=1}^V m_k\Bigr], \quad \forall j \in \{1, \dots, V\} $$
118117 따라서,, $$ m_j $$ 는 overflow나 underflow가 될 수 없습니다.
119118
@@ -166,7 +165,7 @@ attention에는 softmax 때문에 input 전체를 봐야한다.
166165하지만, softmax는 Online-softmax로 전체를 안봐도 계산이 가능하다
167166
168167self-attention에도 이를 적용한다.[[ link]] ( https://arxiv.org/pdf/2112.05682 )
169- $$ v^* \in \mathbb{R}^d $$ ,$$ s^* \in \mathbb{R}^d $$ 를 0으로 초기화하고 , $$ m^* $$ 를 -inf로 초기화합니다.
168+ $$ v^* \in \mathbb{R}^d $$ ,$$ s^* \in \mathbb{R} $$ 를 0으로 초기화하고 , $$ m^* $$ 를 -inf로 초기화합니다.
170169query $$ q $$ , keys $$ k_1, \dots, k_n $$ 와 values $$ v_1, \dots, v_n $$ 가 주어질 때 , keys와 values들을 순서대로 사용합니다.$$ k_i $$ , $$ v_i $$ 가 주어지면 $$ s_i = \mathrm{dot}(q, k_i) $$ 를 계산합니다.그리고 나서,$$ m^* = \max(m^*,s_i) $$ , $$ v^* \leftarrow v^* e^{m^* - m_i} + v_i e^{s_i - m_i} $$ , $$ s^* \leftarrow s^* e^{m^* - m_i} + e^{s_i - m_i} $$ 를 update합니다.그리고,$$ \frac{v^*}{s^*} $$ 를 계산해줍니다.
171170
172171
@@ -187,20 +186,35 @@ $$m^* = \max(m^*,s_i)$$, ,$$ s^* \leftarrow s^* e^{m^* - m_i} + e^{s_i - m_i} $$
187186
188187
1891881 . $$ Assume \quad v^* = \sum_{j=1}^{i-1} v_je^{\,x_j - m^*} $$
190- $$ m_i = \max(m^*,s_i) $$ , $$ s_i = \mathrm{dot}(q, k_i) $$
189+ $$ m_i = \max(m^*,s_i) $$ , $$ s_i = \mathrm{dot}(q, k_i) $$
191190$$ v^* \leftarrow v^* e^{m^* - m_i} + v_i e^{s_i - m_i} $$
192191$$ = \left(\sum_{j=1}^{i-1} v_j e^{\,x_j - m^*}\right) e^{\,m^* - m_i} + v_i e^{\,s_i - m_i} $$
193192$$ = \sum_{j=1}^{i} v_j e^{\,s_j - m_i} $$
193+ 그리고, $$ \frac{v^*}{s^*} $$ 를 계산해줍니다.
194194$$ m_i = \max(m^*,s_i) $$ 가 현재까지 계산한 $$ \max $$ 이기 때문에 online self-attention 수식이 정확함이 증명이 됩니다.
195195
196196
197- ### FlashAttention
197+ ## FlashAttention
198+
199+
200+
201+ Online-Self Attention을 실제로 구현체를 Open-source로 제공한 것이 FlashAttention이다.
202+ FlashAttention은 Tri Dao라는 사람이 제안을 하였습니다.FlashAttention의 알고리즘에서 idea가 새로 나온것은 없지만 Online-Self Attention을 실제로 여러 LLM에 적용할 수 있도록 구현체를 제공한 최초의 사례입니다.
203+
204+ ### Forward
205+ ![ FlashAttention] ( \assets\images\DeepLearning\KernelFusion\FlashAttention_forward.png )
206+
207+ FlashAttention의 forward는 이와 같습니다. algorithm의 line벼로 설명을 하도록 하겠습니다.
208+
209+ 1 .
210+
211+ 2 . 위의 online-self attention 에서 보았듯이 $$ v^* \in \mathbb{R}^d $$ ,$$ s^* \in \mathbb{R} $$ 를 0으로 초기화 했는데, FlashAttention에서는 이를 $$ O , \ell $$ 로 각각 표기법을 바꾸었습니다. Batch dimension으로 확장했기에 $$ O \in \mathbb{R}^{N \times d} $$ ,$$ \ell \in \mathbb{R}^N $$ ,$$ m = (-\infty)_N \in \mathbb{R}^N $$ 로 초기화합니다.
212+
198213
199214
200- ![ FlashAttention] ( \assets\images\DeepLearning\KernelFusion\FlashAttention_forward.png )
201215
216+ #### Backward
202217
203- Online-Self Attention을 실제로 알고리즘 관점에서 자세하게 분석한게 FlashAttention이다.
204218
205219## Conclusion
206220
0 commit comments