俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

俺人トップページ

目次


最近の記事


まとめ記事

これまで私の取り組んできた内容のまとめ記事です。

2023年

2022年

2021年

2020年

2019年

資格関連

G検定、E資格、AWS認定の体験記などです。

G検定

E資格

AWS認定

CISSP


セキュリティ・ガバナンス関連

AIに関するセキュリティやガバナンスに関する記事です。

第7回AI戦略会議 AI事業者ガイドライン

機械学習システムセキュリティガイドライン Version 2.00

AI原則実践のためのガバナンス・ガイドライン ver.1.1


コンペ関連

各種コンペサイトでの振り返りや、記事のまとめです。

ProbSpace

Signate

Nishika

Solafune

Kaggle


講座・書籍関連

受講した講座や取り組んだ書籍の記録です。

米国AI開発者がゼロから教えるDocker講座(U-demy)

 

GCI 2019 Winter(東京大学グローバル消費インテリジェンス寄付講座)

Pythonによるスクレイピング機械学習テクニック

オライリー・ジャパン社「実践 機械学習システム」


実装紹介など

Pythonでの実装や、環境構築などの記事です。

自然言語処理

SVM

自作パソコン


雑記

その他、イベント参加記録などです。

AI・人工知能EXPO2019

f:id:kanriyou_h004:20211115150125j:plain

以上

 

 

 

Pythonによるスクレイピング&機械学習テクニックのまとめ

Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]を参考にさせていただきながら、取り組んだ、スクレイピング機械学習の記事まとめです。

事前準備編(環境構築)

スクレイピング

機械学習

以上

f:id:kanriyou_h004:20200523132243p:plain

 

 

【12位解法】Nishika開催「ケーブルコネクタの種類判別」の振り返り。

データ分析コンペティションNishika」で開催された「ケーブルコネクタの種類判別」に参加し、12位で銅メダルの成績を残せました!

今回のコンペも、私の好きな画像分類のタスクだったので、結果も残せてよかったです。

また、USBケーブルなどのコネクタの種類を判別するという超身近な題材だったので、とても楽しく取り組めました。

f:id:kanriyou_h004:20211022202920p:plain

では、振り返って参りたいと思います。

1.全体構成

今回のコンペは、多種多様に細分化されたケーブルコネクタの画像およそ数千枚についてケーブルの種類を正確に分類できる多クラス分類するコンペでした。

データの特徴としては、ケーブルコネクタだけが写っているのではなく、一般のご家庭等で撮影されたと思われる、背景も明るさもサイズもバラバラで統一感のない画像でした。中にはピントすらあっていない画像もあってなかなか苦戦しました。

物体検出モデルで、ケーブルコネクタの位置を検知して分類するモデルにもチャレンジしてみたのですが、なかなか精度が出せず、結局、慣れ親しんだEfficientnetのモデルを採用しました。

f:id:kanriyou_h004:20211023000930p:plain

今回は、あまり手の込んだことはやりませんでしたが、各モデルで交差検証時に出力したfoldごとの出力を、そのモデルだけで平均をとるのではなく、全モデル分の出力の加重幾何平均をとって全体の予測値とする工夫をすることで精度を上げることができました。

2.前処理

前処理については、ほとんど何もせず、計算量を減らすために画像サイズを512×512に変更すうところだけを実施しました。

時間があれば、水増し等についても試せばよかったとも思いましたが、リソースをEfficientnetの学習の方に使うことを優先しました。

【前処理】

こちらは、訓練データ、テストデータの両方に適用する共通の処理です。

  処理内容

サイズ変更

cv2.resize()を使って、画像サイズの変更を実施。

今回は512x512に変更。

3.モデル構築

 全体としては、Efficientnetのb0~b5で学習をして、予測値を加重幾何平均をとることで、ensembleしました。

f:id:kanriyou_h004:20211023000930p:plain

ensembleの方法としては、各モデルのfoldごとに、検証データの予測値の加重幾何平均をとって、精度がよい加重を採用しました。

最終的に6モデル×5foldの学習済みモデルでテストデータの予測を実施して、検証データで精度が良くなった加重を使った加重幾何平均を最終的な提出予測値としました。

f:id:kanriyou_h004:20211023215640p:plain

このモデルで提出したファイルで、最終スコア:0.967383 となり、全体で12位で、銅メダル圏内に入ることができました。

4.感想

今回のコンペは、ケーブルコネクタの種類を判別するとても身近なコンペでした。

衛星データ分析プラットフォームのSolafuneで開催されている 市街地画像の超解像コンペ と並行して取り組んでいたので、俯瞰的な画像と、目の前の生活画像とを行ったり来たりしつつも、コード上では似たような処理もあったりするところが面白かったです。

技術的には、Yoloでの物体検出モデルや、データの水増し等も、いろいろ試してみたかったのですが、リソースの利用時間の制限でなかなか取り組めなかったのは残念でした。早く半導体の価格が下がってGPUマシンを購入したいです。

5.謝辞

最後となってしまいましたが、本コンペを運営してくださいました、Nishika の運営の皆様、データを提供してくださいましたサンワサプライの皆様、一緒にコンペに取り組んでいらっしゃった皆様、Twitter上でやりとりを実施させていただいた皆様に心より感謝申し上げます。

引き続き、このコンペで身に着けた知識や経験を生かして、社会に還元できるよう取り組んでまいりたいと思います。

 

【過去記事】

G検定、E資格の取得から、これまでに取り組んできた道のりは以下にまとめております。何かのご参考にしていただければ幸いです。

oregin-ai.hatenablog.com

oregin-ai.hatenablog.com

Solafune x Microsoft 市街地画像の超解像化コンペに向けて超解像化について学ぶ。#MScup

今回は、衛星データ分析サイトのSolafuneで現在開催されている「市街地画像の超解像化」コンペ(MScup)に向けて参考にしている情報をまとめてみました。

現在参加中の皆様や、これから参加予定の皆様のご参考になれれば幸いです。

【目次】

1.【宙畑】超解像×衛星画像でできること。関連論文の紹介とTellusでやるには

sorabatake.jp

今回のコンペを開始するのにピッタリのサイトだったので、最初に参考にさせていただきました。

このサイトのおかげで、初手で躓かずに提出までこぎつけました。

衛星画像分野で、機械学習が必要になっている背景から始まっているので、Solafuneの今回のコンペの主旨にある、社会実装の加速に貢献するという意味でも、非常に有用なコンテンツです。

また、超解像の理論的な説明から、論文やサンプルコードへのリンクが貼ってあり充実した内容になっています。

著者は、以下の記事の事前準備として、勉強されたとのことです。

sorabatake.jp勉強された内容についても、以下の資料にまとめて公開してくださっています。

docs.google.com

2.【Sansan Builders Blog】超解像の歴史探訪 -SRGAN編

buildersbox.corp-sansan.com

1つ目のサイトで出てきたキーワード「SRGAN」で検索してたどり着いたサイトになります。

GANの説明から始まり、SRGANについて、生成器、識別器、損失関数、学習の部品に分けて実装例つきで説明してくださっています。

また、GitHubにコードも公開してくださっていて、とても参考になりました。

3.【Quiita】トップ学会採択論文にみる、超解像ディープラーニング技術のまとめ

qiita.com2014年〜2018年までのCVPR, ECCV, ICCV などのコンピュータビジョンのトップ画像処理学会に採択された、ディープラーニング(DL)を用いた超解像モデルをまとめてくださっています。

どのモデルが、どのような系統のモデルなのかという樹形図もあるので、各モデルの特徴を把握する目安になります。

主要論文リストや、トレーニング用データセットなども紹介されているので、お役立ち度が高いです。

4.【ULCAMTCVSMPS】超解像ネットワークを微分の差の絶対値で学習してみました。

crater.blog.ss-blog.jpこちらのサイトは、GANを使わない、Super-Resolution Neural Netowrk について、説明してくださっています。

残念ながら学習済みモデルの公開は終わっているようなのですが、モデルのコードはGitHubに公開してくださっています。

6.おわりに

とても興味深いテーマで、様々な分野で応用されている技術なので、まだまだ、始まったばかりのコンペですが、すでに学びが盛りだくさんです。

引き続き、コンペで取り組む中で得た情報を発信していきたいと思います。

 

f:id:kanriyou_h004:20210917182331p:plain

 

 

【3位解法】ProbSpace開催「宗教画テーマの分類」の振り返り。

データ分析好きが集まる交流プラットフォーム「ProbSpace」で開催された「宗教画テーマの分類」に参加し、3位の成績を残せました!

今回のコンペは、私の好きな画像分類のタスクだったので、結果も残せてよかったです。

また、画像分類のタスクでも、プロ野球データ分析チャレンジで使った、多値分類に2値分類を応用する戦法が活用できたのもよい経験でした。

Image

では、振り返って参りたいと思います。

1.全体構成

今回のコンペは、米・メトロポリタン美術館が公開している、キリスト教の宗教画画像を、「受胎告知」、「最後の晩餐」など、13種類のテーマに分類するという画像分類コンペでした。

データの特徴として、訓練データが654枚、テストデータが497枚と、比較的データ量が少ないデータだったので、今回のコンペで許容された学習済みモデルをいかに活用できるかがポイントになりました。

また、今回も前回のプロ野球データ分析チャレンジと同様、分類するクラスごとの数に偏りがあったため、画像分類の処理を行った後、2値分類で精度を上げて上書きする処理を実施しました。

<データの分布>

f:id:kanriyou_h004:20210913203104p:plain

 

f:id:kanriyou_h004:20210913212909p:plain

少ないデータ量を補うために、以下の対策を実施いたしました。

  • 前処理:垂直・水平に反転した画像、回転した画像、セピア色に変換した画像を水増しした訓練データを作成。それぞれの画像の水増し割合を16パターンで学習を実施。
  • モデル1段目:学習済みのEfficientNetを活用してファインチューニングを実施。
  • モデル2段目:全クラスを予測する多値分類のモデルと、クラスごとの2値分類を実施するモデルを作成して、最後に上書きを実施。

また、ProbSpaceのトピックで公開させていただいたデータ内の画像の重複について(簡易自動化バージョン)を使って、重複・類似した画像を調べました。

2.前処理

前処理については、以下の2通りで実施いたしました。

データの前処理については、albumentationsというライブラリを利用しました。

【前処理 共通】

こちらは、訓練データ、テストデータの両方に適用する共通の処理です。

前処理

処理内容

サイズ変更

albumentationsのResize()を使って、画像サイズの変更を実施。後続の学習済みモデルに合わせたサイズに変更。

標準化

albumentationsのNormalize()を使って、画素値の標準化を実施。

【前処理 水増し】

こちらは、訓練データを水増しするために実施する前処理です。テストデータには実施しません。

前処理

処理内容
水平反転

albumentationsのHorizontalFlipを使って、指定した割合の画像を水平反転。

垂直反転

albumentationsのVerticalFlipを使って、指定した割合の画像を垂直反転。

回転 albumentationsのRotateを使って、指定した割合の画像を回転。
セピア変換 albumentationsのToSepiaを使って、指定した割合の画像をセピア色に変換。今回のデータでは、古い絵画もあったので、採用してみました。

 

3.モデル構築

 今回は、大きく分けて、「学習済みのEfficientNetを活用してファインチューニングを実施」する1段目と、プロ野球データ分析チャレンジで使った、「全クラスを予測する多値分類のモデル」の出力に、「クラスごとの2値分類を実施するモデル」の出力を上書きをする2段目を組み合わせた、スタッキングモデルを構築しました。

f:id:kanriyou_h004:20210913212909p:plain

 

【1段目:EfficientNet】

1段目は、EfficientNetの学習済みモデルをファインチューニングして、2段目に渡す訓練データの予測値と、テストデータの予測値を出力するモデルを16個作成しました。

それぞれのモデルで、訓練データの水増しの割合を変更することで、パターン分けしました。

このモデルは、skywalkerさんがトピックに投稿してくださっている、EfficientNetB0使ったベースラインも参考にさせていただきました。

このモデルの学習には、GPUが必要となるので、Google Colabで実行するには、実行時間に制約があるので、とても骨が折れました。

 

【2段目:LighetGBM】

2段目は、16種類の予測値を訓練データとして、「多値分類するモデルの予測値」に、「各分類ごとの2値分類をするモデルの予測値」を上書きすることで、精度を上げる方法を実施しました。

この方法は、プロ野球データ分析チャレンジで採用した方法を応用しました。

今回も、通算500個以上のモデルを作って、いろいろな組み合わせを試し、そのうち200回以上の提出を実施しました。後半はほぼ毎日提出しました。


4.感想

今回のコンペは、宗教画の意味するテーマを分類するコンペでした。

これまで、宗教画をじっくり眺めて、テーマを考えることがなかったので、「あ、この絵のこの部分はこういうことを表しているんだ。」と、モデル以上に自分自身も学習することができました。(笑)

途中、自分が分類する場合に、「十字架があるな」、「人が多いな」などを基準にしたりするので、物体検出が応用できないかと、Yoloにも挑戦してみましたが、なかなか精度は上がりませんでした。

参考:学習済みのYOLOv5による物体検出結果の特徴量への追加

新しい技術にも触れられて、とても有意義なコンペとなりました。

また、今回からProbSpaceでも、最終提出ファイル選択方式となったので、最後の最後まで、ファイル選びに悩みました。

Public:Privateが13%:87%と、Publicスコアがあまり重視できない割合だったこともあって、ShakeDownしてしまいましたが、何とか3位になることができました。

5.謝辞

最後となってしまいましたが、本コンペを運営してくださいました、ProbSpace の運営の皆様、一緒にコンペに取り組んでいらっしゃった皆様、Twitter上でやりとりを実施させていただいた皆様に心より感謝申し上げます。

今回学ばせていただいた事項を糧に、社会貢献できるよう引き続き精進してまいりたいと思います。

 

【過去記事】

G検定、E資格の取得から、これまでに取り組んできた道のりは以下にまとめております。何かのご参考にしていただければ幸いです。

oregin-ai.hatenablog.com

oregin-ai.hatenablog.com

【第2弾】 rinna社が公開した、日本語に特化した「GPT-2」「BERT」事前学習モデルをつかって昔話創作モデルを実装してみた!

今回も、rinna株式会社が8月25日に公開してくださった、日本語に特化した「GPT-2」と「BERT」の事前学習モデルを使ってモデルを実装してみました。

今回は、昔話の冒頭の文章を与えると、話の続きを創作してくれるモデルです。

corp.rinna.co.jp

 では、振り返っていきたいと思います。

日本語に特化した「GPT-2」「BERT」事前学習モデルをつかって昔話創作モデルを実装してみた!

1.今回実装した昔話創作モデル

今回実装した昔話創作モデルは、冒頭の文章を与えると、続きの文章を複数生成し、提案してくれるというモデルです。

本来であれば、膨大な量の文章を集めて、長時間学習させないと行けないところ、公開された事前学習モデルを使うことで、GPUも使うことなく簡単に実装することができました。

昔話創作モデルの仕様

  1. 昔話の冒頭の文章として「昔々あるところに、」という文章を入力する。
  2. 入力された文章をもとに、続きの物語を複数生成する。
  3. おもしろ文章を見つけて、日々の生活に役立てる。

2.全体像

コード全体は以下の通りで、Google colaboratory上で実行しました。

GitHubにも公開しています。

https://github.com/Oregin-ML/Fairy-tale-creation-model

!git clone https://github.com/rinnakk/japanese-pretrained-models

%cd /content/japanese-pretrained-models

!pip install -r requirements.txt

# ライブラリをインポートします。
from transformers import T5Tokenizer, AutoModelForCausalLM
# 学習済みモデルをダウンロードします。
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-gpt2-medium")
tokenizer.do_lower_case = True
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt2-medium")

# 生成する文章の冒頭部分を設定します。
beginning = '昔々あるところに、'
# 文章を機械学習の入力とできるようコード化します。
input = tokenizer.encode(beginning, return_tensors="pt")

# 文章の生成処理を実施します。(出力はコードで出力されます。)
output = model.generate(input,do_sample=True, max_length=100, num_return_sequences=5)
# 出力されたコードを文章に戻します。
DecodedOutput = tokenizer.batch_decode(output)

# 生成された文章を表示します。
print('#'*40)
print(f'冒頭が「{beginning}」となる文章を出力します。')
print('#'*40)
for j in range(5):
 
print('#'*40)
 
print(f'### 文章案{j} ####')
 
print('#'*40)
 
i = 0
 
while i < len(DecodedOutput[j]):
  
print(DecodedOutput[j].replace('</s>','')[i:i+30])
  
i = i+30

では、コードを順番に見ていきます。

3.学習済みモデルをインストールする

GitHubより、学習済みモデルをダウンロードして、ダウンロードされたフォルダ内にある、「requirements.txt」を使えば、必要なライブラリが一発でインストールできます。 

!git clone https://github.com/rinnakk/japanese-pretrained-models 

%cd /content/japanese-pretrained-models

!pip install -r requirements.txt

4.学習済みモデルを定義する

学習済みモデル("rinna/japanese-gpt2-medium")を、読み込みます。

この数行を記載するだけで、莫大なデータやリソース、時間を必要とする学習を省略することができます。

# ライブラリをインポートします。
from transformers import T5Tokenizer, AutoModelForCausalLM
# 学習済みモデルをダウンロードします。
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-gpt2-medium")
tokenizer.do_lower_case = True
model = AutoModelForCausalLM.from_pretrained("rinna/japanese-gpt2-medium")

5.生成の基となる昔話の冒頭部分を設定する。

昔話の冒頭部分として、'昔々あるところに、'を設定します。この部分を変更すれば、昔話に限らず、いろいろな文章が作れます。

なお、文章を機械学習の入力として使えるようにコード化する必要があります。

# 生成する文章の冒頭部分を設定します。
beginning = '昔々あるところに、'
# 文章を機械学習の入力とできるようコード化します。
input = tokenizer.encode(beginning, return_tensors="pt")

6.続きの物語を生成して出力する。

モデルのgenerate()を使って、続きの物語を生成します。

入力にはコードに変換済みの冒頭の文章(input)を指定します。

各オプションは以下のとおりです。

do_sampleをTrueとすることで、実行毎に出力を変化させることができます。

max_lengthは、生成する文章の最大の長さになります。

num_return_sequencesは、生成する文章の数になります。

出力は、コードで出力されるため、.batch_decode()を使って、文章にもどします。

表示にあたっては、改行をいれて出力させています。

# 文章の生成処理を実施します。(出力はコードで出力されます。)
output = model.generate(input,do_sample=True, max_length=100, num_return_sequences=5)
# 出力されたコードを文章に戻します。
DecodedOutput = tokenizer.batch_decode(output)

# 生成された文章を表示します。
print('#'*40)
print(f'冒頭が「{beginning}」となる文章を出力します。')
print('#'*40)
for j in range(5):
 
print('#'*40)
 
print(f'### 文章案{j} ####')
 
print('#'*40)
 
i = 0
 
while i < len(DecodedOutput[j]):
  
print(DecodedOutput[j].replace('</s>','')[i:i+30])
  
i = i+30

7.実行結果

このコードを実行した出力の例は以下のとおりです。

少し違和感のある文章もありますが、なかなか良い文章もできています。

中には、続きが気になってしまう文章案もあります。

手直しすれば、オリジナルの昔話も作れそうですね。

f:id:kanriyou_h004:20210827172901p:plain

8.感想

今回は、日本語に特化した事前学習モデルを使って、昔話創作モデルを作ってみました。

大したものは作れないと思っていたのですが、なかなか良い文章が出てくるので、創作文章を作るときの最初のアイデア出しに使えそうな気がしました。

もっと色々使ってみて、活用方法を考えていきたいと思います。

 

【第1弾】簡易大喜利モデル

oregin-ai.hatenablog.com

【これまでの道のり】

oregin-ai.hatenablog.com

oregin-ai.hatenablog.com

oregin-ai.hatenablog.com

oregin-ai.hatenablog.com

oregin-ai.hatenablog.com

f:id:kanriyou_h004:20210826185619p:plain



 

rinna社が公開した、日本語に特化した「GPT-2」「BERT」事前学習モデルをつかって簡易大喜利を実装してみた!

元女子高生AI「りんな」などで知られるrinna株式会社が8月25日に公開してくださった、日本語に特化した「GPT-2」と「BERT」の事前学習モデルを使って、簡易大喜利(?)モデルを実装してみました。

日本語CC-100と日本語Wikipediaの計75ギガバイトのデータを、8つのNVIDIA Tesla V100 GPUで、45日間も掛けて学習しないと行けない事前学習モデルが、無料で簡単に使えるのは感動でした!

corp.rinna.co.jp

 では、振り返っていきたいと思います。

日本語に特化した「GPT-2」「BERT」事前学習モデルをつかって簡易大喜利を実装してみた!

1.今回実装した簡易大喜利モデル

今回実装した簡易大喜利モデルは、指定した文字列のうち、隠した部分の文字列を予測する機能を使って、面白い回答を期待するというモデルです。

本来であれば、いろいろと実装して、データを集めて、長時間学習させないと行けないところ、公開された事前学習モデルを使うことで、あっという間に実装することができました。

簡易大喜利モデルの仕様

  1. 穴埋めさせたい文章を入力する。
    例:「世界一うるさい人と言ったら、。」
  2. 簡易大喜利モデルが「」の部分を予測して、確率が高い順に出力する。
    例:「あなた
  3. おもしろ回答を見つけて、こっそり楽しむ。

2.全体像

コード全体は以下の通りで、Google colaboratory上で実行しました。

GitHubにも公開しています。

https://github.com/Oregin-ML/Simple_Ogiri_model

 

!git clone https://github.com/rinnakk/japanese-pretrained-models

%cd /content/japanese-pretrained-models

!pip install -r requirements.txt
import torch from transformers import T5Tokenizer, RobertaForMaskedLM # load tokenizer tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-roberta-base") tokenizer.do_lower_case = True # due to some bug of tokenizer config loading # load model model = RobertaForMaskedLM.from_pretrained("rinna/japanese-roberta-base") model = model.eval() print('#'*40) print('答えさせたい内容を「〜、何。」と聞いてみてください。') print('例;世界一うるさい人と言ったら、何。') print('※最後の「。」を忘れずに。') print('#'*40) # original text text = input() # prepend [CLS] text = "[CLS]" + text if '何' in text: # tokenize tokens = tokenizer.tokenize(text) # mask a token masked_idx = -2 tokens[masked_idx] = tokenizer.mask_token print('#'*40) print('#以下の[MASK]の部分を考えます。') print(tokens) print('#'*40) # convert to ids token_ids = tokenizer.convert_tokens_to_ids(tokens) # convert to tensor token_tensor = torch.tensor([token_ids]) # get the top 10 predictions of the masked token with torch.no_grad(): outputs = model(token_tensor) predictions = outputs[0][0, masked_idx].topk(10) print('#'*40) print('#思いついた答えは・・・') for i, index_t in enumerate(predictions.indices): index = index_t.item() token = tokenizer.convert_ids_to_tokens([index])[0] print(i, token) print('#以上です。') print('#'*40) else: print('何か聞いてくれないとわからないです。')

では、コードを順番に見ていきます。

3.学習済みモデルをインストールする

GitHubより、学習済みモデルをダウンロードして、ダウンロードされたフォルダ内にある、「requirements.txt」を使えば、必要なライブラリが一発でインストールできます。

 

!git clone https://github.com/rinnakk/japanese-pretrained-models 

%cd /content/japanese-pretrained-models

!pip install -r requirements.txt

4.学習済みモデルを定義する

学習済みモデル("rinna/japanese-roberta-base")を、読み込みます。

この数行を記載するだけで、莫大なデータやリソース、時間を必要とする学習を省略することができます。

import torch
from transformers import T5Tokenizer, RobertaForMaskedLM

# load tokenizer
tokenizer = T5Tokenizer.from_pretrained("rinna/japanese-roberta-base")
tokenizer.do_lower_case = True  # due to some bug of tokenizer config loading

# load model
model = RobertaForMaskedLM.from_pretrained("rinna/japanese-roberta-base")
model = model.eval()

5.大喜利させたい文章を入力する

大喜利させたい文章を標準入力で受け付けます。

ポイントは、文章の頭に[CLS]を追加するところです。

print('#'*40)
print('答えさせたい内容を「〜、何。」と聞いてみてください。')
print('例;世界一うるさい人と言ったら、何。')
print('※最後の「。」を忘れずに。')
print('#'*40)

# original text
text = input()

# prepend [CLS]
text = "[CLS]" + text

6.「何」の部分を予測して、出力する。

「何」の文字列が含まれていれば、「masked_idx」で指定した箇所の単語を予測して、確率が高い単語を10個出力します。今回は、文末が「何。」となっていることを前提に、後ろから2つ目の単語を予測することにしています。

赤字下線の部分で、穴埋めの予測処理を実施しています。

if '何' in text:
  # tokenize
  tokens = tokenizer.tokenize(text)
  # mask a token
  masked_idx = -2
  tokens[masked_idx] = tokenizer.mask_token
  print('#'*40)
  print('#以下の[MASK]の部分を考えます。')
  print(tokens)  
  print('#'*40)
  # convert to ids
  token_ids = tokenizer.convert_tokens_to_ids(tokens)

  # convert to tensor
  token_tensor = torch.tensor([token_ids])

  # get the top 10 predictions of the masked token
  with torch.no_grad():
      outputs = model(token_tensor)
      predictions = outputs[0][0, masked_idx].topk(10)

  print('#'*40)
  print('#思いついた答えは・・・')
  for i, index_t in enumerate(predictions.indices):
      index = index_t.item()
      token = tokenizer.convert_ids_to_tokens([index])[0]
      print(i, token)
  print('#以上です。')
  print('#'*40)

else:
  print('何か聞いてくれないとわからないです。')  

7.実行結果

このコードを実行して、「世界一の天才といったら、何。」と入力した場合の実行結果は以下の通りです。

なかなかいい味を出している回答を返してくれています。

f:id:kanriyou_h004:20210826203630p:plain

 

8.感想

今回は、日本語に特化した事前学習モデルを使って、簡易大喜利モデルを作ってみました。このモデル自体が何かの役に立つかというと、そうでもないのですが、こんなに簡単に穴埋め予測モデルが作れてしまうので、この事前学習モデルの有用性を身を持って知ることができました。

今後は、このモデルをどの様に活用できるかの視点でも考えていきたいと思います。

 

 

【これまでの道のり】

oregin-ai.hatenablog.com

oregin-ai.hatenablog.com

oregin-ai.hatenablog.com

oregin-ai.hatenablog.com

oregin-ai.hatenablog.com

f:id:kanriyou_h004:20210826185619p:plain