---
# System prepended metadata

title: 琳山專題-2
tags: [專題]

---

---
title: 琳山專題-2
tags: 專題
---
<style>
.blue {
  color: #3361FF;
}
</style>


## 琳山專題 - Text Generation

許馨文，林栢衛

## 第一二周 （一）

* 看 cs224n Lecture  1 - 4 [影片網址](http://onlinehub.stanford.edu/cs224)
* examples/run_squad.py  [HuggingFace](https://github.com/huggingface/transformers)
* word2vec: [概念](https://hackernoon.com/word2vec-part-1-fe2ec6514d70) [實做](https://blog.cambridgespark.com/tutorial-build-your-own-embedding-and-use-it-in-a-neural-network-e9cde4a81296) 

## 第三四周 （一）

* 看 cs224n Lecture  5 - 8 [影片網址](http://onlinehub.stanford.edu/cs224)

### 關於Transformer Paper的問題
- 我看了transformer的paper還有這一篇post: https://medium.com/@bgg/seq2seq-pay-attention-to-self-attention-part-2-cf81bf32c73d
- 在transformer的paper裡面，有提到說總共會有三個vector
    - Query: 似乎是跟target的output word有關
    - Key: 根據 https://arxiv.org/pdf/1606.03126.pdf ,這好像是一個QA中的question跟source knowledge組成出來的東西（是要用來對照跟query的相似度的.原文:  The key should be designed with features to help match it to the question )
    - Value:  the value should be designed with features to help match it to the response (answer)
- 第一個問題
    - 我對key的理解是他是從question跟source knowledge來的,所以我沒辦法對上,我們的input sequence要怎麼去擁有key
    - ![](https://i.imgur.com/IU8uyaW.png)

- <span class="blue">Answer: ![](https://i.imgur.com/dxowhIg.png)
在 transformer的內部 其實 query, key. value vector 的得到方式，就是 對 input vector 去 乘一個 query 的 linear transform matrix 變成 是 Query vector, 然後 Key, Value vector 的得法 比照辦理，如投影片所示，那你會找到 QA 的 paper 我猜是因為你去找那篇的 reference 所看到，但其實是這個樣子的，query，key，value 的用意 只是希望 每一個 vector 可以透過 相乘 的 operator 找到 跟自己比較相近的 vector 們，如果兩個 vector 每個維度數值接近，那它內積的值就會變很大， 那經過 softmax 之後 他有可能對當下的 query 很重要，因為它們彼此很像可能具備共同的性質，所以它門在一個高維度空間可能聚在一起，softmax 完之後，你會得到一個機率分佈，在根據不同位置的機率分佈 乘上位置的 value vector，你在作 attention weight (softmax) 完的機率分佈數值 相當於你在作 search，你在找說 哪個 input 根當下這個位置的 query vector 比較有關，相當於 你在回答閱讀測驗的問題 你需要從文章內抓出跟 query 有相關的的成員，然後抓出對應的答案區間。 那回歸 transformer 你只是在找說 今天這個句子的這個字可能根這個句子裡的誰比較有關係，然後去把資訊蒐集起來 (aggregate) 形成後面的 embedding ，讓後面的 embedding 去學習到上下文的語意關係。
- 第二個問題
    - 在這篇文章中 https://medium.com/@bgg/seq2seq-pay-attention-to-self-attention-part-2-cf81bf32c73d 作者說: In current NLP work, the key and value are usually came to the same thing, therefore key=value.
    - 因為我對key的理解是，他應該是拿來跟query對照的東西,所以我沒辦法理解為什麼這個跟query相似的東西最後會跟 value(answer)是一樣的
    - ![](https://i.imgur.com/4VvlkjQ.png)

- <span class="blue">Ans: ![](https://i.imgur.com/CDwjQFf.png)
這個投影片的值 是 把當下1 這個地方的 query vector 去 跟 input
的 key vector 作內積，其中內積完的數值就是 (70,10,10,10）經過 softmax 完就是 (0.7, 0.1, 0.1, 0.1 ) 那你會發現說今天 value 的 vector 每個位置要乘多少，會 depends on 那個位置的 key vector，所以在 design key 跟 value 的 vector的時候，也有會把 key/value 的 transform 都是用 同一個 linear transform matrix 去得到，相當於 你是用當下這個1的位置query 去 key/value 內找出誰根它比較有相關，再做出 attention weight 並乘上對應位置的 value的 vector. 


- 第三個問題
    - 想請問助教覺得上面關於query, key, value的定義有沒有更好的解釋
   - <span class="blue">Ans: 我覺得只是在找出這個 element 跟 input 哪些東西可能有關，今天即使你用另外一種 search 的方法 不要 q,k,v 也是可以的，而是單用 q,v 或是 單用 q vector 去跟自己作 attention 也沒有不行。 它只是在抓出今天input 誰根它有關係，並把語意的資訊 aggregate 起來。

### BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension

- 我大概對paper的理解是BART他大概有一個跟transformer很像的架構,一個多層的encoder, 一個多層的decoder, 然後他特別的地方是他們實驗了非常多不同的pretrain encoder跟decoder的方法,方法有以下的:
    - Token Masking: 像BERT一樣,隨基地把token用<mask> 取代掉
    - Token Deletion: 隨基地把input句子中的token刪掉,然後model要學會哪些位子的token不見了
    - Text infilling: 好像是把一段input裡面某一個長度的text都換成mask,然後model要學會的是去預測有多少token不見了
    - Sentence permutation: 一個document的句子順序被重新亂排過
    - Document rotation: 一段input裡面隨機選一個token,然後以那個token為基準去rotate那個document. Model必須學習該document的起始點在哪裡
- 根據我對Paper第三部分的理解,是他們可以透過以上的pretraining methods去train一些encoder, decoder裡面的參數,然後去把encoder跟decoder使用在不一樣的task(Sequence classification, token classification task, sequence generation tasks, machine translation tasks)上
- 我的問題是,前面那些pretraining methods看起來有時候是餵進去一個句子，有時候是有多個句子的document.然後他們要學習的東西都不一樣,那麼這樣decoder跟encoder裡面參數的維度是不是都不一樣呢? 
    參數維度 是 一樣的 你可以想成只是喂進去的data 長相不一樣， 可是像 word embedding vector 的大小還是一樣的， 頂多是自己加了 [MASK] 這樣的token 在input端或是刪掉而已
    
    - Token deletion, 所以output出來東西是不見得token的位子嗎?是一串integer嗎
        
        <span class="blue">我看其他blog的介紹，其實作法也很簡單，只是在input端把token拿掉在 decoder output 的時候 要reconstruct 原來的句子而已，原本的作法是把該位置換成 [MASK] Token. https://dair.ai/BART-Summary/
        
    - sentence permutation: output出來的是排好的document嗎? 並非是document，你可以是三句話但順序是shuffle完的 然後 label就是原本的順序 <span class="blue">對
    
    
    - 這樣怎麼能夠把pre-trained的encoder跟encoder拿去做paper第三段提到的task呢? 像是第三段提到會拿model去做 classification, 所以這樣不同狀況下pretrain出來的東西,都可以拿去做成某句子或某token的embedding嗎? 如果是的話,所以第三段提到的其他tasks(Sequence classification, token classification task, sequence generation tasks, machine translation tasks) 從這個model獲得的都是他的input的embedding嗎?
    
    <span class="blue">pretrained的意義只是有一個很好的 parameter initialization 你在作不同task的時候，你還是要train那一整個大模型，只是那個大模型的起始參數是你pretrained完所得到的，在使用上並非只是抽 feature，這樣才能用在不同的task上用
    
