# 112-2胡老師上課筆記 - LLM part 1 [https://github.com/joshhu/mustllm2024](https://github.com/joshhu/mustllm2024) ## 自然語言處理 (Natural Language Processing - NLP) - 自然語言指的是人類交流的語言 ## 自然語言處理常見任務 - OCR、斷詞、詞形還原、詞性標註、詞幹擷取(tokenize的基礎)(認知,理解) - 語法歸納、斷句、解析(認知,理解) - 實體辨識、情感分析、術語提取,詞義消歧、關係抽取、語義解析,指代消除(認知,理解) - 自動摘要、機器翻譯、聊天機器人、多模態、問答系統(生成) ## 自然語言處理常見解法 - ==基於規則==的方法 - ==基於統計學==的方法 - 一般統計學方法(e.g:n元語言模型) - 機器學習(非神經網路,如LR、SVM) - ==基於神經網路==的方法(也算統計方法) - RNN類 - Transformer類 - ==基於大型語言模型==的方法 - 預訓練+微調+RLHF - 不訓練微調,用提示語工程 :::success ## 詞的表示 - wordnet:蒐集所有用過的詞,編成字典 - 普林斯頓大學開發 - [範例程式:wordnet](https://github.com/shhuangmust/AI/blob/112-2/10.wordnet.ipynb) ![image](https://hackmd.io/_uploads/rklVgq_GA.png) - Label encoding - 「貓」是0,「狗」是1,「馬」是2.... - 無法表達文字之間的實際關係 ::: :::info ## 句子的表示 - 向量表示法,稱為稱embedding - Neighbor Based:一個詞的意義由他的鄰居決定 ![image](https://hackmd.io/_uploads/HyFqb9Of0.png) - 用高維向量來表示 - 每個詞佔一個維度,稱one-hot encoding - 但還是無法表示詞之間的關聯 - 維度太高,一個20萬字彙就是20萬X20萬 - 資料太稀疏(向量中0太多) - 很難計算 - 無法加新字 ![image](https://hackmd.io/_uploads/B1c9M9_MR.png) - [範例程式:one-hot encoding(獨熱碼)](https://github.com/shhuangmust/AI/blob/112-2/13.one_hot.ipynb) ::: ## 低維稠密向量建構 - 將高維向量用數學方法降維(如SVD、PCA) - 使用神經網路及反向傳播(1986年提出) - 神經機率語言模型(2000年Bengio提出) - NLP from scratch(2008年提出) - Word2vec(Mikolov 2013年提出) - GloVe(2014年提出) ## 神經網路語言模型 - 統計語言模型,使用的是離散空間的分布;神經語言模型使用連續空間的分布 - 2000年Bengio提出使用FFN的網路對P(wi|wi-n+1...wi-1)進行預訓練,最後接上一個Softmax對應到詞彙表所有詞的機率分佈 ![image](https://hackmd.io/_uploads/BJPZNcufC.png) :::warning ## Word Embedding - 一個詞,可以由多個==隱空間的特徵features==來表示 - 2013 年由Tomas Mikolov 等人所提出Word2Vec - [範例程式:Word2Vec](https://github.com/shhuangmust/AI/blob/112-2/16.gensim_wiki.ipynb) ![image](https://hackmd.io/_uploads/r1MmH9uMR.png) ::: :::success ## Google Bert 如何用embedding表示字詞 - 使用30522個token,每個token用768維的向量來表示 - [範例程式:Bert_embedding](https://github.com/shhuangmust/AI/blob/112-2/Bert_embedding.ipynb) ![image](https://hackmd.io/_uploads/HyBCScuzC.png) ::: - Meta Llama2 如何用embedding表示字詞 ![image](https://hackmd.io/_uploads/SJxpud9dzA.png) - Google MT5 如何用embedding表示字詞 ![image](https://hackmd.io/_uploads/HJzp_qOMR.png) ## 語言模型 - 有了字詞表示法,如何表達語言(透過語言模型) - 神經網路早期透過:RNN(循環神經網路),來循環記住之前講過的字詞 - LSTM或GRU等改進的RNN - RNN缺點:計算太複雜 ## Transformer的出現 - 2017出現的Transformer - 利用Multi-head Attention機制來了解文字上下文的重要性 - ChatGPT中的T就是Transformer - 是目前所有語言模型的基礎 ![image](https://hackmd.io/_uploads/r179q5uM0.png) ![image](https://hackmd.io/_uploads/r1u5cqOM0.png) ## 預訓練模型 - Pre-trained Language Model(PLM) - 透過語料庫(測試資料),在一個神經網路中,將所有語言的知識學好並儲存,稱之為==預訓練模型== - 如果有新的任務,將新任務的資料當作訓練集,==微調==預訓練模型即可 - 預訓練模型範例: - 雙向LSTM的ELMO - Regressive生成語言模型的GPT1/2/3/4 - 雙向Encoder的BERT - Seq2seq的BART,T5 - 預訓練模型微調過後,表現非常好 ![image](https://hackmd.io/_uploads/rkRE6c_MC.png) ![image](https://hackmd.io/_uploads/By0UZo_zC.png) ## 預訓練語言模型的問題 - 微調任務的==標註資料取得不容易== - 大型語言模型(LLM)參數量爆炸性成長,==已經無法微調== ![image](https://hackmd.io/_uploads/rkQ0TcdMR.png) ![image](https://hackmd.io/_uploads/ryMdZoOMA.png) :::success ## 為什麼要大型語言模型 - 一般預訓練語言模型,參數多在1億上下 - [參考範例](https://github.com/shhuangmust/AI/blob/112-2/Bert_embedding.ipynb) ![image](https://hackmd.io/_uploads/HyFrgodMR.png) - 大型語言模型參數大量增加,模型能力變好(GPT3參數量為1750億) - 2020年的==Scaling Law:大型語言模型隨著參數量增加,能力正比增加== ![image](https://hackmd.io/_uploads/SyiEki_z0.png) - 大家開始堆參數 ![image](https://hackmd.io/_uploads/SyOKJsOMC.png) - Emergent abilities:準確度並不是等距成長,而是在參數量最大的模型中準確率急劇上升 ![image](https://hackmd.io/_uploads/ry021iuMA.png) ![image](https://hackmd.io/_uploads/SyICksdMC.png) ::: ## 大型語言模型的語種分布 - BLOOM(繁體中文佔0.05%) ![image](https://hackmd.io/_uploads/ryHcxjOzR.png) - GPT3的訓練資料 ![image](https://hackmd.io/_uploads/Sy9AxjOGR.png) - Common Crawl:88TB ![image](https://hackmd.io/_uploads/BywgZj_z0.png) ## 中文資料集 - [OSCAR 2301](https://huggingface.co/datasets/oscar-corpus/OSCAR-2301) ![image](https://hackmd.io/_uploads/Sy6WmjuMA.png)