機械学習勉強会 2020/01

SRA 産業第1事業部 鈴木真吾

今回の話

正月中やってた

  • PyTorch
  • 自然言語処理

0
 Advanced issue found
 

PyTorch

PyTorch

  • Facebook 社製の機械学習フレームワーク
    • 初リリース 2016/12
    • 現ステーブル 1.3
  • Pythonic な書き方ができる
  • Lua 製の Torch がベース
  • Chainer の API から影響を受けている
    • eager mode OR Define-by-Run 
  • 論文での採用数が増えている
    • 研究界隈では人気

モチベーション

PyTorch と TensorFlow の比較

  • PyTorch
    • An open source machine learning framework
  • TensorFlow
    • An end-to-end open source machine learning platform
    • 2.0 あたりから「platform」 に
0
 Advanced issue found
 

PyTorch と TensorFlow の比較 (性能面)

https://medium.com/huggingface/benchmarking-transformers-pytorch-and-tensorflow-e2917fb891c2

 

  • パフォーマンスにはそれほど差がない
    • CPU だと PyTorch が若干速い
    • GPU だと TensorFlow が若干速い
0
 Advanced issue found
 

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 のようなもの
0
 Advanced issue found
 

PyTorch が使えるクラウドサービス

  • GCP
    • Google Colaboratory でも使える
  • AWS
  • Azure
  • アリババクラウド
0
 Advanced issue found
 
0
 Advanced issue found
 

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 でも!
0
 Advanced issue found
 

自然言語処理

深層学習以前の自然言語処理

0
 Advanced issue found
 
  • 専門化されたモジュール

    • 形態素解析
    • 係り受け解析
    • 構文解析

    • etc

  • 構文木など中間的な状態を扱う必要

    • それぞれのモジュールをつなぎ合わせる作業が発生

深層学習による自然言語処理

0
 Advanced issue found
 
  • End-to-End 学習

    • 入力と出力を直接学習する

      • 例) 機械翻訳なら直接翻訳前後の言語が入出力になる

      • 中間的な状態を扱わずに済む

    • 相変わらず必要なタスクも

      • 形態素解析

      • 単語埋め込み

  • 最近の動向

    • Transformer

    • BERT

Transformer

0
 Advanced issue found
 
  • Attention Is All You Need [Łukasz Kaiser et al., arXiv, 2017/06]

  • 元は翻訳に使うNNということで Transformer と呼ばれている
  • Attention (注目) を使った NN
    • RNN でも CNN でもない
0
 Advanced issue found
1

Transformer

0
 Advanced issue found
 
  • Embedding

    • 単語埋め込み
  • Positional Encoding
    • 位置情報の付加
0
 Advanced issue found
1

Attention

0
 Advanced issue found
 

Q(クエリ) と K(キー) の内積のsoftmax と V(値) の積

  • q, k が近い v が大きく結果に反映される
  • 正確にはこれは dot-product attention
0
 Advanced issue found
1
Attention (Q, K, V) = softmax(\frac{QK^t}{\sqrt{d_k}})V

辞書オブジェクトのようなと理解しておく

0
 Advanced issue found
1

BERT

0
 Advanced issue found
 
  • Bidirectional Encoder Representations from Transformers
    • 内部的には Transformer ブロックを複数個もつ
    • 事前学習を行う
      • Masked Language Prediction
      • Next Sentence Prediction
0
 Advanced issue found
1

BERT の何がすごいか?

0
 Advanced issue found
 
  • 汎用的なモデルを事前学習ができる
    • ​別タスクにファインチューニング・転移学習が可能
  • BERT を元にした DL モデルが色々提案されている
    • RoBERTa
    • ALBERT
    • XLNet
    • ERNIE
    • etc
0
 Advanced issue found
1

PyTorch での自然言語処理

  • 形態素解析
    • MeCab, Janome, Juman++
  • NLPフレームワーク
    • torchtext
    • AllenNLP
    • transformers

PyTorch + BERT

0
 Advanced issue found
 
0
 Advanced issue found
1

日本語 + BERT

0
 Advanced issue found
 
  • 東北大学 乾・鈴木研究室 New!
    • huggingface/transformers に組み込まれている
    • MeCab を使った形態素解析あり
  • 京都大学の黒橋・河原研究室
    • 学習済みモデルを公開している
    • 前述の transformers 向けのバイナリあり
      • 約 400 MB 程度あり回線が遅い時は注意

 

transformers で日本語を扱うために色々準備が必要で面倒だったが、最近日本語にも対応した

(最初は苦労した話を書きたかったが仕方ないね)

0
 Advanced issue found
1

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 発表資料

  • 802