機械学習勉強会 2020/01
SRA 産業第1事業部 鈴木真吾
今回の話
正月中やってた
- PyTorch
-
自然言語処理
PyTorch
PyTorch
- Facebook 社製の機械学習フレームワーク
- 初リリース 2016/12
- 現ステーブル 1.3
- Pythonic な書き方ができる
- Lua 製の Torch がベース
- Chainer の API から影響を受けている
- eager mode OR Define-by-Run
- 論文での採用数が増えている
- 研究界隈では人気
モチベーション
- PFN が Chainer から PyTorch に移行した
- 最近盛り上がっている
PyTorch と TensorFlow の比較
- PyTorch
- An open source machine learning framework
- TensorFlow
- An end-to-end open source machine learning platform
- 2.0 あたりから「platform」 に
PyTorch と TensorFlow の比較 (性能面)
https://medium.com/huggingface/benchmarking-transformers-pytorch-and-tensorflow-e2917fb891c2
- パフォーマンスにはそれほど差がない
- CPU だと PyTorch が若干速い
- GPU だと TensorFlow が若干速い
PyTorch と TensorFlow の比較 (機能面)
PyTorch | TensorFlow | |
---|---|---|
HW | GPU | GPU, TPU |
モバイル | CoreML, PyTorch Mobile |
CoreML, MLKit |
Web | ONNX.js | TensorFlow.js |
- TensorFlow はプラットフォームを名乗るだけあってTensorFlow だけで色々できる印象
- できること自体にはそれほど差はない
PyTorch の機能
- 自動微分
- eager mode、graph mode に対応
- TorchScript
- TFLite のようなもの
PyTorch が使えるクラウドサービス
- GCP
- Google Colaboratory でも使える
- AWS
- Azure
- アリババクラウド
PyTorch コード例
PyTorch の記述例
import torch
# y = a x を記述する
x = torch.randn(100, 3)
# 微分の変数として扱うので requires_grad=True をつける
a = torch.tensor([1,2,3.], requires_grad=True)
# mv は Matrix x Vector の意
y = torch.mv(x, a)
Neural Network サブクラス
class Net(nn.Module):
def __init__(self, n_in, n_units, n_out):
super(Net, self).__init__()
self.l1 = nn.Linear(n_in, n_units)
self.l2 = nn.Linear(n_units, n_out)
def forward(self, x):
h = F.relu(self.l1(x))
y = self.l2(h)
return y
PyTorch を触ってみた感想
- python 触ったことがあるなら敷居は高くない
- python らしく記述できる
- numpy と同じ感覚でかける
- GPU の利用も楽
- GCP でも使える
- Colaboratory でも!
自然言語処理
深層学習以前の自然言語処理
-
専門化されたモジュール
- 形態素解析
- 係り受け解析
-
構文解析
-
etc
-
構文木など中間的な状態を扱う必要
-
それぞれのモジュールをつなぎ合わせる作業が発生
-
深層学習による自然言語処理
-
End-to-End 学習
-
入力と出力を直接学習する
-
例) 機械翻訳なら直接翻訳前後の言語が入出力になる
-
中間的な状態を扱わずに済む
-
-
相変わらず必要なタスクも
-
形態素解析
-
単語埋め込み
-
-
-
最近の動向
-
Transformer
-
BERT
-
Transformer
-
Attention Is All You Need [Łukasz Kaiser et al., arXiv, 2017/06]
- 元は翻訳に使うNNということで Transformer と呼ばれている
- Attention (注目) を使った NN
- RNN でも CNN でもない
Transformer
-
Embedding
- 単語埋め込み
- Positional Encoding
- 位置情報の付加
Attention
Q(クエリ) と K(キー) の内積のsoftmax と V(値) の積
- q, k が近い v が大きく結果に反映される
- 正確にはこれは dot-product attention
辞書オブジェクトのようなと理解しておく
BERT
-
Bidirectional Encoder Representations from Transformers
- 内部的には Transformer ブロックを複数個もつ
- 事前学習を行う
- Masked Language Prediction
- Next Sentence Prediction
BERT の何がすごいか?
-
汎用的なモデルを事前学習ができる
- 別タスクにファインチューニング・転移学習が可能
- BERT を元にした DL モデルが色々提案されている
- RoBERTa
- ALBERT
- XLNet
- ERNIE
- etc
PyTorch での自然言語処理
- 形態素解析
- MeCab, Janome, Juman++
- NLPフレームワーク
- torchtext
- AllenNLP
- transformers
PyTorch + BERT
-
https://github.com/huggingface/transformers
- PyTorch etc 向けの NLP ライブラリ
- TensorFlow2 向けにも使える
- BERT 以外にも様々なDLモデルに対応
- PyTorch etc 向けの NLP ライブラリ
日本語 + BERT
- 東北大学 乾・鈴木研究室 New!
- huggingface/transformers に組み込まれている
- MeCab を使った形態素解析あり
- 京都大学の黒橋・河原研究室
- 学習済みモデルを公開している
- 前述の transformers 向けのバイナリあり
- 約 400 MB 程度あり回線が遅い時は注意
transformers で日本語を扱うために色々準備が必要で面倒だったが、最近日本語にも対応した
(最初は苦労した話を書きたかったが仕方ないね)
huggingface/transformers で日本語処理
from transformers import BertJapaneseTokenizer
tokenizer = BertJapaneseTokenizer.from_pretrained('bert-base-japanese-whole-word-masking')
tokenizer.tokenize('お腹が痛いので遅れます。')
# ['お', '##腹', 'が', '痛', '##い', 'ので', '遅れ', 'ます', '。']
from transformers import BertForMaskedLM
model = BertForMaskedLM.from_pretrained('bert-base-japanese-whole-word-masking')
text = "僕は友達とXXXXをすることが好きだ"
# 色々処理して "XXXX"の部分を予測する
_, predicted_indexes = torch.topk(predictions[0, masked_index], k=5)
predicted_tokens = tokenizer.convert_ids_to_tokens(predicted_indexes.tolist())
print(predicted_tokens)
# ['話', 'ゴルフ', 'ゲーム', '仕事', '食事']
形態素解析
Masked Language Model による予測
参考文献
-
BERTによる日本語構文解析の精度向上
-
BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
-
Attention is All You Need
参考書籍
-
現場で使える!PyTorch開発入門 深層学習モデルの作成とアプリケーションへの実装
-
つくりながら学ぶ!PyTorchによる発展ディープラーニング
-
BERT, Transformer について解析と実装あり
-
-
自然言語処理の基本と技術
-
Deep Learning with PyTorch
-
現在電子書籍版が無料で配布されている
-
おわり
色々感想
-
この界隈の技術の変化が非常に速い
-
自宅マシンの非力さがよくわかった
-
Transformer のタスク実行中に異常停止が複数回
-
多分熱暴走
-
-
Google Colaboratory がやっぱり便利
社内機械学習勉強会向け 発表 2020/01
By Shingo Suzuki
社内機械学習勉強会向け 発表 2020/01
社内機械学習勉強会向け 2020/01 発表資料
- 1,119