iT邦幫忙

2022 iThome 鐵人賽

DAY 13
1

Transformer 是當代自然語言處理最重要的技術了,如果您對於 Word2vec、RNN、seq2seq 等等之類的技術不太熟悉,那麼就先放著沒關係,之後有時間再去補上這方面的知識即可。

我們今天就來用 transformer 做一個最基本的文本分類。

  1. 先來使用 tokenizer。
from transformers import AutoTokenizer

tokenizer_name = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(tokenizer_name)
  1. 接著我們把資料輸入,做 tokenization,並且 return pytorch 的 tensor。
string_arr = [
    "Only those who will risk going too far can possibly find out how far one can go.",
    "Baby shark, doo doo doo doo doo doo, Baby shark!"
]
inputs = tokenizer(string_arr, padding=True, truncation=True, return_tensors="pt")
print(inputs)

會得到:

{'input_ids': tensor([[  101,  2069,  2216,  2040,  2097,  3891,  2183,  2205,  2521,  2064,
          4298,  2424,  2041,  2129,  2521,  2028,  2064,  2175,  1012,   102],
        [  101,  3336, 11420,  1010, 20160, 20160, 20160, 20160, 20160, 20160,
          1010,  3336, 11420,   999,   102,     0,     0,     0,     0,     0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]])}
  1. 接著我們再來使用 Transformer Model,跟 tokenizer 一樣,指定名稱即可載入了,真的是非常方便。
from transformers import AutoModelForSequenceClassification

model_name = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
outputs = model(**inputs)
  1. 接著我們把 output 的 logits 給印出來,print(outputs.logits),會得到下面的結果。
tensor([[ 0.9738, -0.8098],
        [-1.1881,  1.2323]], grad_fn=<AddmmBackward0>)
  1. 接著我們就把這個結果過 softmax 吧!
import torch

predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)
print(predictions)

會得到下面的結果:

tensor([[0.8561, 0.1439],
        [0.0816, 0.9184]], grad_fn=<SoftmaxBackward0>)

這裡我們就可以看出,第一句話的結果是 [0.8561, 0.1439],也是說第0個結果的機率是0.8561,第1個結果的機率是0.1439。
而第二句話的結果是[0.0816, 0.9184]。依此類推,第0個結果的機率是0.0816,第1個結果的機率是0.9184。

  1. 接著我們再用這段程式碼,把 label 來打印出來,才知道第0個和第1個的類別是什麼。model.config.id2label
    會得到:
{0: 'NEGATIVE', 1: 'POSITIVE'}
  1. 我們的第一句話是 "Only those who will risk going too far can possibly find out how far one can go."。這是出自 T. S. Eliot 的詩句,意思是指:只有那些願意冒險遠方的人,才可能有機會能了解一個人能走多遠。

你都願意向遠方出發冒險前進了,但是你還是不一定能知道自己能走多遠,只是有機會能夠知道而已。這句話雖然有其正面性,鼓勵你冒險遠方,但是 possibly 那個詞,就讓它添上了負面與消極感的色彩了。這個 distilbert 模型挺準確的,NEGATIVE 的機率是 0.8561,讀出這麼幽微且細緻的意涵。

如果你把那個 possibly,改成 definitely,就會得到完全相反的結果了哦!真的很有趣!

  1. 我們的第一句話是 "Baby shark, doo doo doo doo doo doo, Baby shark!"。這個就不用特別再提了,是一首很經典又歡快的兒歌,所以就被標註成 POSITIVE 了。


上一篇
# Day12-Hugging Face Tokenizer
下一篇
# Day14-Hugging Face Transformer Pipeline 和 TF model
系列文
變形金剛與抱臉怪---NLP 應用開發之實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言