作りながら学ぶ!pytorchによる発展ディープラーニングpart4
7_nlp_sentiment_transformerについてのメモ
7.1単語分類
Janome:Pure Pythonで書かれた辞書内包の形態素解器
Tokenizer:解析する
単語分割する関数を定義する→単語をリストに内包して表示する。
wakati:分かち書きモード品詞の表示なしで文章の分割をしている。
1.2Mecab
Chasen:辞書 -Ochasen:Chasenに互換する-Oオプション
引用
Welcome to janome's documentation! (Japanese) — Janome v0.4 documentation (ja) (mocobeta.github.io)
janome/janome/tokenizer.py at master · mocobeta/janome · GitHubMeCab: Yet Another Part-of-Speech and Morphological Analyzer (taku910.github.io)
7.2torchtextでのDataset, DataLoaderの実装方法
正規化する関数の定義(半角、全角、小文字化とか)改行、スペースの削除、数字文字の一律0化
文章データの読み込み
テキストとラベルへの設定をする。
引数の意味は次の通りsequential: データの長さが可変か、文章は長さがいろいろなのでTrue.ラベルはFalse tokenize: 前処理や単語分割をするための関数を定義 use_vocab:単語をボキャブラリーに追加するかどうかlower:アルファベットがあったときに小文字に変換するかどうか include length: 文章の単語数のデータを保持するか batch_first:ミニバッチの次元を先頭に用意するかどうかfix_length:全部の文章を指定した長さと同じになるように、paddingする。
単語の数値化
ボキャブラリーの作成と頻度を出力する、ID(トークン)に変換した結果の出力。一つのベクトルと単語が一意の関係になった。
7.4word2vec, fastTextを用いた日本語単語のベクトル表現の実装
単語分割にはMecab+NElogdを使用
前処理とJanomeを合わせた関数を定義する。
word2vecのインストール、ベクトル化したバージョンのボキャブラリーを作成する。コサイン類似度で比較する。
fastest
word2vecの延長上にあるフレームワーク
7.5IMDbからDataLoaderを作成
IMDbデータセットをtsv形式に変換
import.io:URL入力yしてデータ化する
訓練データのtsvファイルの作成、open(<ファイル名>,<モード→w>)
import string:文字列にf、Fを前置して式を{式}と書くことで文字列内にpythonの式の値を入力できるようになる。
ファイル名を取得していく、またreplace(/t→” ”)でタブを消していく。テキスト+/t+1+/t+/n(改行)
f.close()で終了
テストデータも作成
2,前処理と単語分割の関数を定義
記号をスペースに置き換える(カンマ、ピリオド以外
)ピリオドの前後にはスペースを置く。分かち書きもしていく
Dataloaderの作成
訓練データの数:20000、検証データの数:5000、一つ目の訓練データの表示。
ボキャブラリーを作成
単語ベクトルとして英語学習済みモデルの読み込みをする。
ベクトル化したバージョンのボキャブラリーを作成DataLoaderを作成し、データセットで確認しておく。
引用
URLを入力するだけ!コンテンツをスクレイピングしてデータ化してくれる無料ツール「import.io」 (nelog.jp)
オライリージャパン python チュートリアル
Pythonの文字列の改行方法と便利な操作まとめ | HEADBOOST
7.6Transformerモデルの実装
Class:Embedder IDの単語をベクトルに変換していく
前節のDataloaderを取得単語をベクトル化した入出力を確認する。
入力された単語の位置を示すベクトルの情報を付加する。単語の順番と埋め込みベクトルの次元の位置で一意に決まる。
Attentionで全結合層、大きさの調整をする。
7.7Tranceformerの学習・推論、判定根拠の可視化を実装
Dateset、Dataloader、ネットワークモデルの作成、損失関数と最適化手法を定義する
学習・検証を実装
テストデータでの正解率を求める
→0.85、HTMLを作成する関数を実装する。
high light:文字の背景が濃い赤になるHTMLを出力する。ラベルと予想結果を文字に置き換えていく
label==0→negative.pred==0→negative
情報の重みを反映された文章が出力された。
8.BERTモデルの実装
8.2BERTの実装
ネットワークの設定ファイルの読み込み、LayerNormalization層を定義
トランスフォーマーをエンコードに用いて双方向の情報を同時に使用できる。
LayerNormalization層の定義とEmbeddingsモジュールの実装、BertLayerモジュール
文章の単語ID列と、1文目か2文目かの情報を埋め込みベクトルに変換する
埋め込むベクトル表現:ChatGPTの回答→
Token Embeddings(単語埋め込み):
`word_embeddings` は、単語IDを単語ベクトルに変換するための埋め込み層です。
`config.vocab_size` は、BERTの学習済みモデルで使用したボキャブラリーのサイズを表します。
`config.hidden_size` は、隠れ層のサイズ(特徴量ベクトルの長さ)を表します。
Sentence Embeddings(文埋め込み):
`token_type_embeddings` は、文章の1文目と2文目の情報をベクトルに変換する埋め込み層です。
`token_type_ids` が与えられない場合、すべての単語が1文目として扱われ、0になります。
Transformer Positional Embeddings(位置埋め込み):
`position_embeddings` は、単語の位置情報を表す埋め込みベクトルです。
BERTでは、位置情報を学習するために位置埋め込みを使用します。
`config.max_position_embeddings` は、文章の最大長を表します。
ガウシアン活性化関数を使用する。
全てのモジュールを連結する
8.3BERTを用いたbank(銀行、土手)の単語ベクトル表現の比較
BERT用のTokenizerの実装
辞書に格納していく。BERT用の文章の単語分割クラスを実装、ボキャブラリーへのパス
文脈による意味変化を単語ベクトルとして求める。文章をBERTで処理する。1-3で特徴量ベクトルを表現していく。コサイン類似度を計算していく。
8.4BERTを用いたレビュー文章に対する感情分析モデルの実装と学習・推論
IMDbの前処理
感情分析用のBERTモデルを構築
BertForIMDb:ポジ・ネガを判定する部分をつなげたモデル
ファイチューニング用の設定
勾配計算全部False→BertLayer,識別機に勾配ありに変更。
学習・検証を実施
正解率0.9
Attentionの可視化
Layerの構築でBERTを構築した後、感情分析とAttentionを追加していく。
9.video_classification
ECOモデルの実装
2D Netモジュールの作成。畳み込み層とプーリング層で構築していく。
InceptionA-C構築していく
Inception:複数の畳み込み層やプーリング層を組みあわせた構造→異なるサイズや種類のフィルターを同時に使用できる。
ECOの3D Netモジュール
residualを出力する。モデルの予測値と観測値との差を指す。
9.4Kinetics動画をインストールする。動画をframeごとに画像データに変換
事前準備
パスの設定とか
KineticsデータセットでECO用のDataloaderを作成する
ファイルパスのリストを作成
動画の前処理クラスを作成
動画を画像に分割しているから分割された画像たちをまとめて前処理する。
画像をリスケール、センタークロップ。テンソル化する。まとめて標準化する。
Datasetの作成
1行ずつ読み込み、辞書型変数に追加する。
VideoDataset:動画のDataset
ECOモデルでの推論
ダウンロードしていく
学習済みモデルをロード
予測の上位5つの表示をする。
まとめ
これでこの本の学習は終了した、自分の環境が少し足りない部分もあったが、全体的には実行できた。エラーの修正方法も記載があり実施しやすかった。pythonとpytorchについて少しだが学べたように思う。何度か見直す必要性もありそう。
この記事が気に入ったらサポートをしてみませんか?