20. Transformer - BERT 2018

Mở đầu

Đầu tiên nhắc 1 chút ở embedding ở mô hình seq2seq

Seq2Seq embedding tokenize

Mọi câu đều được padding về 1 fixed length bằng PAD token

Đối với câu hỏi thì thường được đảo ngược (reversed) (Sutskever et al 2014)

Ta thấy ở dưới có 4 token là PAD, GO,  EOS, "?"

Sau đó từng token và word sẽ được chuyển sang số -> embedding

Q : [ PAD, PAD, PAD, PAD, PAD, PAD, “?”, “you”, “are”, “How” ]
A : [ GO, “I”, “am”, “fine”, “.”, EOS, PAD, PAD, PAD, PAD ]

Attention

Theo https://pbcquoc.github.io/attention/

"Cơ chế Attention cơ bản là trung bình có trọng số của những "thứ" mà ta nghĩ cần thiết cho bài toán, điều đặc biệt là trọng số này do mô hình tự học được"

Cụ thể hơn, Attention được sinh ra cho vấn đề: khi dịch 2 ngôn ngữ seq2seq, những word ở output nên có trọng số (chú ý) cao hơn với word ở input có vị trị tương ứng

Tương tự như bộ não người, mặc dù mắt quan sát ở vùng rất rộng nhưng thường chỉ tập trung ở một vài phần nhỏ thông tin rồi dùng để xử lí thông tin, quyết định. Cơ chế này giúp tiết kiệm năng lượng nhưng vẫn có hiệu quả tin cậy

Ta bàn về cách chia 2 loại Attention theo phần chú ý:

    - Hard Attention: sử dụng reinforcement learning để học vị trí cần chú ý

    - Soft Attention: Học bộ trọng số bằng backpropagation

Với Hard Attention: model chọn ngẫu nhiên vùng cần để ý sau đó dùng reinforcement learning (vì không có nhãn là vùng nào cần chú ý). Ưu điểm là tiết kiệm tài nguyên nhưng khuyết điểm là khó hội tụ mà kết quả không hơn soft attention là bao

Với Soft Attention: model học trọng số ứng tất cả các thành phần mà ta nghĩ là cấu tạo nên thông tin output. Được training qua backpropagation. Do đó dễ tối ưu hơn và không quá phức tạp nên được tập trung phát triển

Soft Attention cũng chia thành nhiều loại dựa vào ý tưởng chính:

    - Learn to align: xuất hiện trong bài toán dịch máy của Bahdanau, học cách tổng hợp thông tin từ câu được dịch để phát sinh câu đích

    - Global vs Local attention: Global thì học từ mọi thành phần (giống như Soft attention ban đầu). Local attention lấy ý tưởng từ Hard attention, chỉ học một vùng xung quanh vị trí thường chú ý nhất

    - Self attention:  từ Self ám chỉ object sử dụng attention chỉ vào chính bản thân nó ở layer sau. Đây là nguồn gốc mô hình Transformer, cho phép thay thế toàn bộ recurrent architect của RNN bằng các fully connected. 

Chi tiết qua bài toán dịch máy
Vấn đề: những câu dài khó dịch chính xác vì thông tin không được giữ lại đủ trong 1 vector biểu diễn duy nhất (hạn chế chung của Feature Extract)

Attention cho ta thêm một vector lưu trữ khác từ các thành phần. Cách tính đã giới thiệu ở https://hoanglong187.blogspot.com/2023/01/16-co-ban-ve-lstm-attention.html (Score của từng thành phần -> Lấy softmax để tạo attention weight cảu từng thành phần -> context vector là tổng hợp lại (tương đương giá trị trung bình E trong xác suất thống kê)

Một vài áp dụng:

    - Bài toán nhận dạng chữ Tiếng Việt (OCR): nếu dùng CN để học 1 vector biểu diễn 2 chiều duy nhất, rồi dùng LSTM để decoder các chữ tiếng việt thì có hạn chế là phải nén thành 1 vector duy nhất mà tại mỗi thời điểm phát sinh, ta không cần tất cả thông tin này. Do đó sử dụng 1 attention layer để giữ ddaauf ra của mô hình CNN là các feature map trên từng phần ảnh. 

    - Phân tích ngữ nghĩa (Sentiment analysis): Cơ chế tìm những keyword quan trọng trong kết quả dự đoán của 1 câu. Thay vì dùng hidden state ở điểm cuối để phân tích ngữ nghĩa, ta có thể tổng hợp thông tin từ các hidden state ở thời điểm khác nữa, rồi qua hàm nào đó biến thanfh1 vector rồi dùng vector này phân tích ngữ nghĩa
    - Attention cho nhiều vector embedding (Quora Insincere Questions Classification): attention cho tầng  embedding. Task là về phân loại câu hỏi xem có hợp lệ hay không? Team pbcquoc đã chọn sử dụng tầng attention cho các loại embedding khác nhau thay vì dùng các phương pháp tổng hợp thông thường (concat, trung bình cộng, huấn luyện riêng) + nhiều tuning khác

    - Bài toán seq2seq: để sử dụng attention. cần sử dụng tập dataset tự phát sinh (20k mấu, trong đó 5k validation), và có kết quả ("05 thg 05 2017" -> 2007-05-05)
Transformer

https://pbcquoc.github.io/transformer/

Ý tưởng chủ đạo vẫn là ở áp dụng Attention


Bắt đầu phân tích ở high-level: giống các mô hình khác kiến trúc tổng quan cũng gồm 2 lớp encoder và decoder, encoder học trích xuất feature, decoder học predict output.

Một trong những ưu điểm là mô hình có khả năng xử lí song song các từ. Ta thấy rằng encoder có dạng feedforrward neural network, tức gồm nhiều encoder layer, mỗi cái xử lí đồng thời các word. Trong khi đó, LSTM phải xử lí tuần tự các từ. Ngoài ra, Transformer còn xử lí input theo 2 hướng mà không cần stack thêm 1 LSTM nữa như kiến trúc Bidirectional LSTM

Tại đây ta phân tích sinusoidal positin encodingmulti head attention ở encoder

Embedding Layer with Position Encoding
Làm sao để đưa thông tin vị trí vào mô hình? 

Đầu tiên vá từ được biểu diễn bằng 1 vector qua ma trận word embedding có số dòng  bằng kích thước vocabulary. Sau đó các câu được tìm kiếm trong ma trận này, nối nhau thnahf các dòng matrix 2 chiều chứa ngữ nghĩa từng từ riêng biệt. Nhưng Transformer xử lí song song nên thế này không đủ biết vị trí. Muốn hiểu positional encoding, đầu tiên hiểu một số cách naive (ngây thơ) giải quyết vấn đề:

    Biểu diễn vị trí bởi chuỗi 0,1,..,n. Tuy nhiên khi chuỗi dài thì số có thể khá lớn, gây khó khăn khi dự đoán -> Chuẩn hóa về [0, 1] bằng cách chia n, tuy nhiên khoảng cách 2 từ liên tiếp phụ thuộc độ dài chuỗi, đồng thời không hình dung được khoảng đó có bao nhiêu từ, tức position sẽ khác nhau tùy vào độ dài câu

Phương pháp đề xuất sinusoidal position encoding

Vị trí các word được mã hóa bằng 1 vector có kích thước bằng word embedding và được cộng trực tiếp vào word embedding.

Cụ thể, sin tại chẵn, cos tại lẻ:

Giả sử ta có word embedding 6 chiều, position cũng 6 chiều, mỗi dòng ứng 1 từ.
Tại sao làm được? 

    - Tưởng tượng có các số 0-15. Thây rằng bit ngoài cùng bên phải thay đổi mỗi 1 số, bit thứ 2 đổi mỗi 2 số, ... -> Biểu diễn nhị phân

    - 2 từ càng xa nhau thì khoảng cách càng lớn
    - Cho phép model học được mối quan hệ tương đối giữa các từ. Cụ thể, vị trí cảu từ t + offset có thể chuyển thành vị trí của từ t bằng 1 phép biến đổi tuyến tính (dựa theo matrix quay)

Có thể tưởng tượng 1 ví dụ là kim giây và kim phút tạo thành 3600 vị trí và tại sao t+offset và t có thể dễ dàng chuyển đổi  

Encoder

Có thể bao gồm nhiều encoder layer tương tự nhau (chạy nối tiếp). Mỗi encoder layer lại gồm 2 phần chính Multi head attention và feedforward network, ngoài ra còn skip connection và normalization layer

Encoder đầu tiên nhân matrix word embedding ( đã + positional encoding). Sau đó xử lí bởi Multi Head Attention (self attention nhưng nhiều pattern khác nhau )

Self Attention Layer

Self Attention cho phép mô hình khi mã hóa có thể sử dụng thông tin những từ liên quan đến nó. Có thể tưởng tượng như cớ chế tìm kiếm: cho phép mô hình tìm kiếm trong các từ còn lại, từ nào "giống" để mã hóa thông tin dựa trên tất cả từ đó

Với mỗi từ ta cần tạo ra 3 vector: query, key, value vector

    - query vector: vector chưa thông tin từ được tìm kiếm (giống query của Google Search hay Sql)

    - key vector: vector biểu diễn thông tin các từ được so sánh với từ query. Ví dụ các trang web so sánh với từ khóa tìm kiếm của Google Search hay index trong Sql

    - value vector: vector biểu diễn nội dung, ý nghĩa của các từ. Ví dụ như nội dung trang web được hiển thị của Google Search hay data row trong Sql

Để tính tương quan (quan hệ chọn lựa), ta dùng hàm softmax để chuẩn hóa chỉ số quan trọng về [0, 1] sau đó tính trung bình cộng trọng số các vector values

Cụ thể, quá trình tính attention vector có 3 bước:

    - Tính ma trận query, key, value bằng cách khởi tạo 3 ma trận trọng số query, key, vector. Sau đó nhân với input -> thành 3 matrix tương ứng

    - Tính attention weight (nhân 2 ma trận key, query (dot product) để học mỗi tương quan

    - Sau đó chuẩn hóa về [0,1] bằng softmax. 1 tức query giống key, 0 nghĩa là không giống

Multi Head Attention

Mục đích chính: để model có thể học được nhiều mối quan hệ giữa các từ khác nhau. Mỗi bộ self-attention, chúng ta sẽ học được một kiểu pattern, thì chúng ta mở rộng bằng cách thêm nhiều self-attention (song song). Tức thêm nhiều bộ (query, key, value). Giờ đây, ma trận trọng số key, query, value có thêm 1 chiều depth

Ví dụ: model cho phép chú ý đồng thời các pattern dễ quan sát sau:

    - Chú ý từ kế trước của 1 từ

    - Chú ý từ kế sau của 1 từ

    - Chú ý những từ liên quan đến 1 từ

Residual Connection và Normalization Layer: mục đích giúp model hội tụ nhanh hơn và tránh mất mát thông tin trong quá trình trainning (ví dụ như thông tin vị trí các từ được mã hóa)

Decoder

Thực hiện chứng năng giải mã vector của câu nguồn thành câu đích, tức nhận thông tin từ encoder là 2 vector key và value, Kiến trúc decoder gần giống encoder, ngoại trừ thêm 1 multi head attention ở giữa để học mỗi liên quan giữa từ đang dịch và các từ ở câu nguồn

bên phải là Decoder
Masked Multi Head Attention

Là multi head attention nhưng chúng ta cần lưu ý che đi các từ ở tương lai chưa được mô hình dịch đến (để làm vậy chúng ta đơn giản nhân với 1 vector chứa các giá trị 0,1)

Trong decoder còn 1 multi head attention khác có chức năng chú ý các từ ở encoder, layer này nhận vector key và value từ encoder và output từ layer dưới. Đơn giản là để so sánh tự tương quan giữa từ đang dịch và các từ ở nguồn

Final Fully Connected Layer, Softmax và Loss function: Fully connected chuyển output từ layer trước tành matrix có chiều bằng số từ cần dự đoán. Softmax tính xác suất xuất hiện của từ tiếp theo. Loss- function là cross-entropy

Các kĩ thuật hay dùng để huấn luyện Transformer

Optimizer: vẫn sử dụng Adam nhưng learning rate cần được điều chỉnh trong suốt quá trình trainning

Cơ bản thì learning rate sẽ tăng mạnh trong các bước đầu (warn up step), để chạy thoải mái. Sau đó giảm dần, để hội tụ

Label Smoothing: Với mô hình nhiều triệu tham số, dễ bị overfit. Nên label Smoothing để hạn chế điều này. Ý tưởng là phạt model khi quá tự tin vào việc dự đoán. Thay vì mã óa nhãn là 1 one-hot vector, thì đổi htanhf 1 phân bố xác suất vào các trường hợp còn lại


Implement: cho bài toán translate seq2seq
Transfer Learning: tận dụng kinh nghiệm học được từ 1 vấn đề để áp dụng vào 1 vấn đề có liên quan khác. Ví dụ: thay vì train model mới hoàn toàn cho phân loại chó/mèo, có thể tận dụng 1 model đã train trên ImageNet dataset với hàng triệu ảnh. Pre-trained này được train tiếp trên tập dataset chó/mèo -> quá trình nhanh hơn, kết quả tốt hơn


Fine-tuning: là 1 loại Transfer Learning. Đơn giản là lấy 1 pre-trained model, tận dụng 1 phần hoặc toàn bộ các layer, thêm/sửa/xóa 1 vài layer/nhánh để tạo 1 model mới. Thường các layer đầu của model được freeze (đóng băng) - tức weight không đổi giá trị trong quá trình train.Lí do là các layer này đã có khả năng trích xuất thông tin ở mức ổn, được học từ quá trình training trước đó -> model chỉ phải update các layer cao. Ví dụ các Object detect model xây trên Classifier model

BERT 2018

https://viblo.asia/p/bert-buoc-dot-pha-moi-trong-cong-nghe-xu-ly-ngon-ngu-tu-nhien-cua-google-RnB5pGV7lPG

https://viblo.asia/p/hieu-hon-ve-bert-buoc-nhay-lon-cua-google-eW65GANOZDO

Bidirectional Encoder Representations from Transformer, thường được dùng làm pre-train model, có output là các vector đại diện theo ngữ cảnh 2 chiều của từ, được xử dụng để transfer sang các task trong NLP 

Sự ra đời của BERT

- Thách thức: Thiếu hụt dữ liệu đầu vào có nhãn chất lượng cao

-> Cơ chế tiền xử lí (pretrain) (transfer từ 1 model chung được đào tạo từ lượng lớn các dữ liệu không gán nhãn). Ví dụ: Word2Vec, Glove, FastText ... Giúp thu hẹp khoảng cách giữa các tập dữ liệu chuyên biệt bằng cách xây dựng mô hình tìm ra đại diện chung, sử dụng lượng lớn văn bản chưa gán nhãn từ các web

- Điểm yếu: không thể hiện sự đại diện theo ngữ ảnh cụ thể -> BERT

BERT có thể biểu diễn ngữ cảnh 2 chiều: Các kĩ thuật khác (Word2vec, FastTextm Glove) tìm ra đại diện thông qua ngữ cảnh chung. Tuy nhiên, ngữ cảnh này đa dạng (đa nghĩa) trong tự nhiên mà các model đó không thể hiện được. BERT mở rộng bằng cách tạo các biểu diễn ngữ cảnh dựa trên các từ trước và sau

Có 2 hướng để biểu diễn ngôn ngữ được huấn luyện trước: feature-based và fine-tuning

Hạn chế: do các model trước đây được xây trên ngữ cảnh 1 chiều nên gây sự hạn chế trong lựa chọn kiến trúc được sử dụng cho pre-training. Ví dụ OpenAI GPT sử dụng kiến trúc left-to-right (tokens chỉ phụ thuộc vào các tokens trước đó)

Vậy, ta dùng hướng tiếp cận fine-tuning để khắc phục những hạn chế đó

Kiến trúc

 Gọi L là số lớp Transformer (blocks), kích thước các lớp ẩn là H và số heads ở lớp attention là A. Trong mọi trường hợp, kích thức bộ lọc (filter size) luôn được đặt = 4H (Tức nếu H =768 thì filter size = 3072 con H = 1024 thì flter size = 4096)

BERTBASE được chọn để có kich thước mô hình giống OpenAI GPT nhằm mục đích so sánh. Tuy nhiên, BERT Transformer sử dụng attention 2 chiều trong khi GPT Transformer sử  dụng attention 1 chiều (không tự nhiên, không hợp cách ngôn ngữ xuất hiện).

Thường Transformer 2 chiều gọi là Transformer encoder, trong khi chỉ sử dụng ngữ cảnh bên trái thường là Transformer decoder (Masked Attention) vì nó có thể được sử dụng để tạo ra văn bản.

Input Representation

Ở đầu vào, ta có thể dùng biểu diễn của 1 câu văn bản đơn hoặc một cặp câu văn bản (ví dụ [câu hỏi, câu trả lời]) được đặt thành 1 chuỗi tạo bởi các từ

Khi đó, biểu diễn đầu vào là tổng các token đó với vector phân đoạn và vị trí tương ứng của các từ trong chuỗi

Một số chú ý:

    - Sử dụng WordPiece embedding (Wu et al.. 2016) với từ điển 30000 từ và sử dụng ## làm dấu phân tách (ví dụ playing thành play##ing)

    - Sử dụng positional embeddings với dộ dài câu tối đa là 512 tokens

    - Token đầu tiên mặc định là [CLS]. Đầu ra của Transformer (hidden state cuối) tương ứng token này sẽ được sử dụng đẻ đại diện cả câu trong task phân loại, nếu không thì được bỏ qua

    - Trong trường hợp các cặp câu gộp lại, phân biệt theo 2 cách:

            + Dùng token [SEP] để phân tách

            + Thêm 1 segment embedding cho câu A và segment embedding cho câu B

    - Khi chỉ có duy nhất 1 câu, segment embedding chỉ có câu A 

Pre-training Task
Ta đào tạo BERT bằng 2 nhiệm vụ dự đoán giám sát (supervised) là Masked LMNext Sentence Prediction

Masked LM

Trực quan mà thấy, một mô hình học sâu được dựa trên ngữ cảnh 2 chiều là tự nhiên và mạnh mẽ hơn so với chỉ dùng 1 chiều

Tái sao trước đây chỉ có 1 chiều? Lí do là vì khi sử dụng ngữ cảnh 2 chiều sẽ gây nghịch lí là 1 từ có thể gián tiếp tự nhìn thấy nó trong một ngữ cảnh nhiều lớp

Vậy để tạo 1 mô hình tìm ra đại diện dựa vào ngữ cảnh 2 chiều, chúng ta cần 1 cách để giấu đi một số token đầu vào một cách ngẫu nhiên và sau đó chỉ dự đoán các token được giấu đi đó (task Masked LM hay MLM). Trong trường hợp này, các hidden vectors ở lớp cuối cùng tương ứng các tokens ẩn đi được đưa vào 1 lớp softmax trên toàn bộ từ vựng để dự đoán (thường mask ngẫu nhiên 15%).

Mặc dù việc này cho phép mô hình đào tạo 2 chiều, nhưng cũng có 2 nhược điểm:

    - Tạo ra sự không đồng nhất giữa pre-train và fine-tuning vì các token được [MASK] không bao giờ được nhìn thấy trong quá trình tinh chỉnh mô hình. Để giảm thiểu điều này, không phải lúc nào chũng ta cũng thay thế những từ được giấu đi bằng token [MASK]

-> Chọn ngẫu nhiên 15% tokens (trong vocabulary):

Ví dụ " con_chó của tôi đẹp quá" từ được chọn để mask là "đẹp":

        - Thay 80% từ được chọn thành token mask "con_chó của tôi [MASK] quá"

        - 10% từ được chọn được thay thế ngẫu nhiên bởi 1 từ ngẫu nhiên "con_chó của tôi máy_tính quá"

        - 10% còn lại giữ không đổi "con_chó của tôi đẹp quá"

Transformer encoder không biết từ nào được yêu cầu dự đoán hay được thay thế ngẫu nhiên, vi vậy nó buộc phải giữ 1 biểu diễn theo ngữ cảnh của mỗi token đầu vào. Ngoài ra do thay thế 1.5% tất cả các tokens nên không ảnh hưởng nhiều khả năng hiểu ngôn ngữ

    - Chỉ có 15% tokens được dự đoán tron mỗi lô -> gợi ý ta cần các bước dùng pretrain model khác để mô hình hội tụ

Next Sentence Prediction

Nhiều task quan trọng trong NLP ví dụ như Question-Answer đòi hỏi quan hệ 2 câu, không trực tiếp sử dụng các mô hình ngôn ngữ. Để đào tạo mô hình có quan hệ giữa các câu, ta xây dựng mô hình dự đoán câu tiếp theo dựa vào câu hiện tại (dữ liệu huấn luyện có thể là 1 corpus bất kì). Cụ thể, khi chọn câu A và câu B cho mỗi training sample, 50% câu B tiếp sau câu A, 50% còn lại là 1 câu ngẫu nhiên nào đó trong corpus

Pre-training Procedure

Fine-Tuning Procedure
Với các nhiệm vụ phân loại câu, BERT được fine-tuning rất đơn giản. Để  có được biểu diễn 1 chuỗi đầu vào với số chiều cố định, ta chỉ cần lấy hidden state ở lớp cuối cùng, tức đầu ra Transformer cho token đầu tiên ( token [CLS] được xây dựng dặc biệt ở đầu chuỗi, gọi vector này là C (C thuộc R[H]). Chỉ có 1 tham số được thêm vào quá trình fine-tuning là W thuộc R[K+H] với K là số class label. Xác suất của nhãn P là 1 phân phối với P thuộc R[K] được tính bởi hàm softmax
Tất cả tham số của BERT và W được fine-tuning để tối ưu hóa hàm lỗi
Apply vào Fine-Tuning

    - Named Entity Recognition (NER): dùng trọng số ở lớp hidden cuối cùng cho mỗi token i là Ti (Ti thuộc R[H]) cho vào 1 classification với tập label là số nhãn NER
    - Situation With Addversarial Generations (SWAG): Hay các bài toán chọn lựa trong nhiều đáp án. Sau khi fine-tuning có vector đại diện V cho câu A và Ci cho câu B thứ i, dot product là 1 score cho mỗi đáp án, xong áp dụng softmax lên chúng
BERT in Vietnam
Chúng ta cũng có thể cho rằng tại Transformer có 2 loại Attention:
    - self-attention tại input của encoder và decoder
    - encoder-decoder attention: giữa vector embedding của encoder và decoder. Vector context được tính  trên encoder đã được tính tương tự với vector decoder nên có nghĩa là giải thích bối cảnh của từ tại vị trí time step decoder  tương ứng 
BERT cũng có thể coi là huấn luyện không chiều (non-directional) vì chỉ xét xung quanh
Fine-tuning model BERT: tức ta thêm ở BERT 1 output layer để tùy biến theo task
Tiến trình (ví dụ cho task question-answer):
    - Embedding toàn bộ các token của các cặp câu bằng embedded vector từ pretrain model (gồm cả token [CLS] và [SEP] -> xác định Start/End Spand)
    - Các embedding vector sau đó đưa vào multi-head attention với nhiều block code (6, 12 hoặc 24 theo kiến trúc của BERT) -> có 1 vector output ở encoder
    - Để dự báo phân phối xác suất cho từng vị trí ở decoder

Nhận xét