Mở đầu
Bài viết được tham khảo từ các bài từ blog của anh phamdinhkhanh (https://github.com/phamdinhkhanh/phamdinhkhanh.github.io/tree/master/_posts)
Mục đích là tìm hiểu kĩ hơn về cơ bản của NLP, những yếu tố nào làm task này trở thành một mảng nghiên cứu riêng, từ đó dẫn đến liên quan về các phương pháp Transformer và việc phát triển các model phức tạp sau này
Word Representation
https://github.com/phamdinhkhanh/phamdinhkhanh.github.io/blob/master/_posts/2019-04-29-ModelWord2Vec.md
Các object cơ bản:
- Character: kí tự
- Word: từ
- Sequence
- Document
- Corpus: bộ văn bản
- Dictionary
Cách làm bao lâu nay của chúng ta là cố gắng xây dựng 1 matrix với mỗi dòng là 1 vector của word
Ví dụ One-hot vector: biểu diễn mỗi từ là theo chính index của nó
One-hot vector đã đảm bảo yếu tố về xử lí được, nhưng chưa đáp ứng về các mối liên hệ như ngữ nghĩa, cấu trúc câu, ... Chi tiết hơn, one-hot vector có các hạn chế: - Không cso tính quan hệ các word
- kích thước vector phụ thuộc độ dài sequence
- Không ổn định khi bổ sung word mới
Word embedding
Để cải thiện các điểm yếu của One-hot vector
Gồm 3 nhóm chính:
- Dùng phương pháp thống kê
- Dimension Reduction: PCA, SVD...
- Neuron Network
SVD Singular Value Decompositon
Dựa trên 1 phép phân tích suy biến tìm matrix gần sát matrix ban đầu. Áp dụng trên ma trận dồng xuất hiện của input và output. Trong đó input là từ hiện tại, output là các từ liền kề bao xung quanh
Ví dụ: từ ma trận vuống X nxn. Lấy U và V là ma trận trực giao suy biến trái , phải và S là ma trận đường chéo chính (đều nxn) ( USV=X). Ta có thể giảm chiều X xuống mxn (SV=X), khi đó mỗi cột của output X là 1 vector embeded tương ứng trong dictionary
Autoencoder
Là neural network gồm 3 layers: input - hidden - output. Thường số unit ở hidden layer sẽ nhỏ hơn
Mỗi từ trở thành 1 vector tương ứng, cuối cùng thu được 1 matrix
Ta dùng hàm cosine để thể hiện giá trị tương quan giữa 2 vector từ
từ đó sắp xếp ra các từ liên quan nhất
Word2vec Gồm 2 phương pháp chính là skip-grams và CBOW:
skip-gram: lựa chọn ngẫu nhiên từ làm bối cảnh (context) rồi xác định các từ mục tiêu (target) xung quanh bối cảnh. Các nghiên cứu cho thấy từ mục tiêu được giải thích tốt hơn dựa vào bối cảnh. Do đó skip-grams xây dựng 1 supervised có input là bối cảnh context, output là mục tiêu target
1 từ -> one-hot vector -neural network (300 units)-> embeded E (nx300) - softmax -> probabilityec là vector nhúng bối cảnh c, y là xác xuất dự báo từ mục tiêu với delta là các :theta là vecto tham số liên kết giữa unit ở hidden layer và output layer, vi là nghĩa của wt-1,wt-2,wt+1,wt+2,... trong vocabulary[10000]
Dùng feed forward và back propagation để tối ưu
CBOW: skip-grams có điểm yếu ở lượng tính toán cao. Để hạn chế điều đó, mô hình CBOW (continueos backward model) được áp dụng như quá trình ngược lại của skip-grams. Khi đó input của skip-grams làm output của CBOW và ngược lại
- input layer: bối cảnh(context) xung quanh target - projection layer: vector đặc trung = trung bình vector biểu diễn từ input
- output: dense layers dùng softmax dự báo xác xuất từ mục tiêu
implement:có thể tham khảo mẫu implement trong trang anh phamdinhkhanh
=> Xác xuất context-word (xác xuất word nằm xung quanh khi có context (từ) ở giữa và ngược lại)
t-SNE: là 1 thuật toán dimension reduce. Thường dùng để giảm về 2 hoặc 3 chiều và biểu diễn trong không gian để nhận biết liên hệ, tính chất. Được sử dụng tốt trong bài toán này như 1 cách biểu diễn độ liên quangensim: là thư viện có sẵn tích hợp cả skip-grams và CBOW, trong đó có 4 tham số: size, window, sg, wokers
Recurrent Neural Network
Hiểu trọn vẹn 1 câu nói từ nội dung toàn bộ câu chứ không phải các từ riêng biệt -> Cần 1 model liên kết các từ ở trước và các từ ở hiện tại để tạo ra liên hệ sâu chuỗiHình trên mô tả 1 Recurrent neural network: input là vector xt, output là ẩn ht, đầu vào được đấu với 1 block A có tính truy hồi và clock này đấu với output Đây là chuỗi sao chép nhiều lần cảu cùng 1 kiến trúc nhằm kết nối liền mạch: đầu ra vòng lặp trước là đầu vào vòng lặp sau:
Hạn chế: nhiều khi cần phải biết sự việc trước đó nữa chứ không phải chỉ một mình từ sát bên -> long-term dependencies. Về mặt lí thuyết, RNN có thể giải quyết sự phụ thuộc dài hạn, tuy nhiên thực tế cho thấy khả anwng học trong dài hạn kém hơn. Một trong những nguyên nhân chính là do sự triệt tiêu đạo hàm của cost function (vanishing gradient) -> LSTMLong Short Term Memory LSTM
1 mạng RNN thường có kiến trúc khá đơn giản, ví dụ như chỉ gồm 1 tầng ẩn là hàm tanh Tuy nhiên với LSTM, có tới 4 tầng ẩn (3 sigmoid và 1 tanh) theo 1 cấu trúc đặt biệt
Ý tưởng chính: thành phần ô trạng thái (cell state):LSTM có khả năng xóa/thêm thông tin vào ô trạng thái và điều chỉnh thông qua cấu trúc cổng
Là cơ chế đặc biệt để điều chỉnh luồng thông tin đi qua (tổ hợp 1 forget gate của hàm activation sigmoid và 1 toán tử nhân). Hàm sigmoid có output là 1 giá trị xác xuất thuộc [0,1] thể hiện số phần thông tin đi qua cổng ( =0 là không cho thông tin đi qua, =1 là cho toàn bộ qua)1 mạng LSTM có 3 cổng kiến trúc dạng này để bảo vệ và kiểm soát ô trạng thái
Các bước:
- Quyết định thông tin được đi qua cell state bởi hàm sigmoid trong forget gate layer (tầng quên). Nhận đầu vào là 2 giá trị ht-1 và xt -> trả về giá trị thuộc [0,1] cho mỗi giá trị ô trạng thái Ct-1. Tầng quên cho phép cập nhật thông tin mới và lưu giữ giá trị khi có thay đổi
- Quyết định thông tin nào được lưu trong state cell, gồm 2 phần. Đầu tiên là 1 tầng ẩn của hàm sigmoid là input gate layer (tầng cổng vào) quyết định bao nhiêu giá trị được cập nhật. Sau đó là tầng hàm tanh tạo 1 vector của 1 giá trị trạng thái mới Ct để được thêm vào state. Kết hợp lại ta có 1 cập nhật
- Những bước trước là quyết định, còn giờ là bước làm thế nào: nhân trạng thái cũ với ft ứng việc quên. Phần tử đề cử it * Ct là 1 giá trị mới được tính toán xem được cập nhật bao nhiêu vào mỗi giá trị trạng thái - Quyết định đầu ra trả về bao nhiêu. Kết quả đầu ra dựa trên ô trạng thái, nhưng được lọc. Đầu tiên chạy qua tầng sigmoid nơi quyết định phần nào ô trạng thái ở đầu ra. Sau đó qua hàm tanh chuyển giá trị về khoảng [-1,1] và nhân nó với đầu ra 1 cổng sigmoid -> chỉ trả phần chúng ta quyết địnhCác biến thể: - thêm ống tiểu (peehole connection) để các cổng kết nối trực tiếp cell state
- Dùng cặp cổng vào cổng ra, thya vì quyết định riêng lẻ thì quyết định đồng thời. Các thông tin chỉ bị quên khi ta muốn cập nhật 1 vài thông tin mới - Cổng truy hồi đơn vị (Gated Recurrent Unit - GRU). Kết hợp cổng quên và cổng vào thành cổng cập nhật (update gate). Nó cũng nhập các ô trạng thái, trạng thái ẩn và thực hiện một số thay đỏi khác. - Encoder: chuyển input thành các feature learning có khả năng học tập cảu task. Đối với Neural network là các hidden layer (Conv + Maxpooling với CNN và Embedding + Recurrent với RNN)
- Decoder: đầu ra Encoder là đầu vào Decoder. Mục đích tìm phân phối xác xuất các features learning ở Encoder -> xác định nhãn. Output là 1 nhãn (với classificate) hoặc 1 chuỗi các nhãn (với seq2seq)
Mô hình seq2seq nên có thứ tự về thời gian. Trong thực tế, các từ ở input có mối liên hệ lớn hơn với các từ ở output cùng vị trí. Do đó, hiểu đơn giản Attension giúp điều chỉnh sự tập trung lớn hơn ở các cặp (input, output) có vị trí tương đương hoặc gần tương đương
 |
seq2seq chưa có attention
 | seq2seq có attention |
|
Ví dụ "I" có trọng số alpha trong context vector lớn hơn những từ còn lại đối với từ "Je". Tức context vector tại mỗi time step ưu tiên đánh trọng số cao hơn cho từ cùng vị trí time step. Do đó có ưu điểm là lấy toàn bộ contexts trong câu Các bước của Attention gồm:
1. tại time step t, tính list score ứng vị trí t và các vị trí còn lại. ht cố định tại time step t, là hidden state của target thứ t tại phase decoder, hs là hidden state của từ thứ s trong phase encoder. Hàm được dùng thường là dot product hoặc cosine similarity 2. Tính phân phối xác xuất theo softmax -> attension weight 3. context vector là tổng các vector hidden state nhân phân phối xác suất tương ứng (giá trị trung bình E) 4. Tính attention vector (để decode ra từ tương ứng ở tập ngôn ngữ đích) là kết hợp context vector và hidden state ở decoder. Vậy attention layer không chỉ học từ chỉ hidden state tương ứng ở units cuối mà còn từ các từ ở các vị trí khác qua context vector. Công thức tính output cho hidden state tương tự đầu ra input gate layer trong RNN[ct, ht] là concatenate theo chiều dài.Wc là R[alpha x (c+h)]. Matrix cần huấn luyện là Wc
Transformer RNN được sử dụng vì ghi nhận sự phụ thuộc vị trí của các từ trong câu. Tuy nhiên, Attention không cần RNN đã có thể cải thiện tác vụ đó (BERT)
- Encoder: xếp chồng 6 layer, mỗi layer gồm 2 sub-layer. Đầu tiên là Multi-Head Attention (tìm hiểu sau). Layer thứ 2 đơn thuần là fully-connected feed-forward layer. Chú ý là ta dùng residual ở mỗi sub-layer sau layer normalization. Gần giống Resnet trong CNN. Output mỗi layer là LayerNorrm(x + Sublayers(x)) -> 512D
- Decoder: cũng xếp chồng 6 layer. Kiến trúc tương tự Encoder trừ việc thêm 1 sub-layer thể hiện phân phối attention tại vị trí đầu tiên. Layer này không khác multi-head self-attention trừ việc không đưa các từ xét sau vào attention.Tức, tại bước i của decoder, ta chỉ biết các từ trước i, đảm bảo attention chỉ áp dụng cho chúng. Cơ chế residual cũng áp dụng tương tự trong Encoder - Lưu ý ta luôn có 1 bước cộng thêm Position Encoding vào các input của Encoder và Decoder (đơn thuần là cộng vector vị trí từ trong câu và vector biểu diễn từ). Có thể chuẩn hóa bằng [0,1] hoặc hàm sin, cos
Cơ chế Attention
Scale dot-product attention
cơ chế self-attention mà mỗi từ có thể điểu chỉnh trọng số của nó cho các từ khác sao cho càng gần trọng số càng lớn và càng xa càng nhỏ dần (giống HoG). Sau embeding layer, ta có đầu vào cảu encoder và decoder là ma trận X mxn (độ dài câu x số chiều vector nhúng)
Wq, Wk, Wv (ứng query, key, value) là 3 ma trận cần huấn luyện. Nhân chúng với X được matrix Q, K, V tương ứng. Query và Key tính score phân phối cho các cặp từ. Value dựa vào score phân phối ddeerr tính vector phân phối xác suât output (ct)
Score mỗi cặp từ (wi,wj) là dot-product giữa query và key (nhằm tạo liên hệ trọng số). Sau đó chuẩn hóa bằng softmax để đưa về 1 phân phối xác xuất đại diện cho attention của từ query tới từ key (context tới target). Trọng số càng lớn thì càng có sự chú ý lớn hơn. Sau đó nhân hàm softmax với value vector để có attention vector của target với cả câu
Tương tự với các từ khác. Ta có công thức: Chia cho dk (số dimension của vector key) là để tránh tràn luồng nếu số mũ quá lớn
Multi-head Attention
Vậy sau quá trình Scale dot-production ta có 1 matrix attention và 1 bộ (Wq,Wk,Wv) tương ứng. Mỗi quá trình như vậy gọi là 1 head của attention. Lặp lại nhiều lần (hạy các head song song) thì có Multi-head Attention concatenate các matrix output của Scale dot-production lại ta có multi-head matrix cùng chiều cao với input matrix, nhân với W0 chiều rộng bằng với chiều rộng của matrix input ta có output cùng kích thước Encoder and Decoder
Sau 2 bước trên, chúng ta xong sub-layer thứ nhất là multi-head Attention layer. Ở sub-layer thứ 2 chúng ta qua các fully connected với shape của output trùng input mục đích là để lặp lại các blick này Nx lần
Sau backpropagation ta thường mất thông tin vị trí từ. Do đó cần 1 residual connection để cập nhật nó vào output, ý tưởng tương tự ResNet. Để quá trình training ổn định, ta thêm 1 layer Normalization ngay sau phép cộngLặp lại block layer 6 lần, ta kí hiệu chúng là 1 encoder
Decoder cũng gần như tương tự Encoder trừ lưu ý: - tuần tự trái qua phải tại mỗi lần xét
- khởi tạo giá trị cho step đầu tiên (init) để decoder hoạt động. Quá trình dịch kết thúc khi hết câu
- Mỗi block layer của decoder phải thêm matrix cuối của Encoder như 1 input của multi-head attention
- Thêm 1 layer Masked Multi-head Attention sub-layer ở đầu mỗi block layer để bỏ những từ đi sau
Sau khi qua 6 block layers của decode sẽ trả 1 vector đại diện cho từ target, sau đó lại dùng Linear + softmax để tính phân phối xác xuất
Để nâng cao accuracy và BLEU score, có thể sử dụng kĩ thuật label smoothing tại ngưỡng epsilon = 0.1 nhằm giảm các label tại vị trí mục tiều xuống < 1, các vị trí khác > 0. Mặc dù gây ảnh huongwr việc không chắc chắn của model nhưng tăng accuracy vì 1 câu có thể nhiều cách dịch
BLEU đánh giá số điểm càng cao nếu kết quả càng sát nghĩa kết quả người dịch. Tức dựa trên P1, P2, P3, P4 theo lũy thừ cơ số e
Điểm mấu chốt trong code của multi-head là phỉa chia lại kích thước Q, K, V để tạo h phép biến đổi trên các matrix con Q', K', V' chung kích thước. Mỗi phép biến đổi là 1 head
Nhận xét
Đăng nhận xét