詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

GPT-2でブログ記事のタイトルをTogetterまとめ風にする「面白いのでやってみて」

オレ定義だけど Togetter まとめ風というのはこういうやつ。

散歩で急にシロクマと会っても食べるのは肉だけにしたほうがいい「肝臓1gに含まれるビタミンAが致死量を超える」 - Togetter

まとめタイトルの終わりに誰かのツイートの引用を挿入する、という形式。よくできたもので、誰かの生の声が入っているだけで、感想やハイライトを抽出し、ちょっと気を引くことができる。まあ一種の演出で、ニュースサイトがやってることもある。

タイトルでアテンションを奪い合わなければならない宿命におけるクリック最適化の手法ということだろう。今回はこれを真似してみることにする。すでに書かれた自分のブログ記事に、括弧書きでセリフっぽいものの引用を捏造して付け加えることで魅力がアップするのか、という実験だ。

こういう生成系のタスクも、とりあえず HuggingFace+Google Colaboratory でやっちゃうか、で十分なクオリティでできちゃうので大変ありがたい。今回は日本語版 GPT-2 の定番、rinna/japanese-gpt2-medium をファインチューニングする。 教師データとするのはここ一年くらいの Togetter の人気まとめで、タイトルが /「.+」$/ な感じで終わっているもの。数えてみたところ 1/3 くらいがオレ定義の Togetter まとめ風タイトルだった。

このタイトルを、たとえば最初のまとめであれば以下のように分解する。

<s>散歩で急にシロクマと会っても食べるのは肉だけにしたほうがいい</s>[SEP]<s>「肝臓1gに含まれるビタミンAが致死量を超える」</s>

そして最初の文から2つ目の文を生成する、というタスクとして学習させる。このへんも transformers にサンプルスクリプトがあるのでとくにコードを書かずにできてしまう。

Colab のリソースの限られた環境でやるならこんな感じ。(最後の方にノートブックを貼っています)

!python ./examples/pytorch/language-modeling/run_clm.py \
    --model_name_or_path=rinna/japanese-gpt2-medium \
    --train_file=../train.txt \
    --do_train \
    --num_train_epochs=5 \
    --save_steps=1000 \
    --save_total_limit=3 \
    --per_device_train_batch_size=1 \
    --per_device_eval_batch_size=1 \
    --output_dir=output \
    --overwrite_output_dir \
    --use_fast_tokenizer=False \
    --block_size=256

10分くらいで終わる。そしたらこうして

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

tokenizer = AutoTokenizer.from_pretrained("rinna/japanese-gpt2-medium")
tokenizer.do_lower_case = True
model = AutoModelForCausalLM.from_pretrained('./output')
model.to(device)
model.eval()

こうじゃ

input_text = '<s>進化中のニャオハに屈伸煽りすると立つ</s>[SEP]';
input_ids = tokenizer.encode(input_text, return_tensors='pt').to(device)
out = model.generate(input_ids, do_sample=True, top_p=0.95, top_k=100, 
                     num_return_sequences=10, max_length=64)

for sent in tokenizer.batch_decode(out, skip_special_tokens=True):
  print(sent)
The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.
Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.
A decoder-only architecture is being used, but right-padding was detected! For correct generation results, please set `padding_side='left'` when initializing the tokenizer.
進化中のニャオハに屈伸煽りすると立つ 「気を付けないと・・・」
進化中のニャオハに屈伸煽りすると立つ 「猫が立ってた」
進化中のニャオハに屈伸煽りすると立つ 「そんな事気にする事ない」
進化中のニャオハに屈伸煽りすると立つ 「可愛すぎる......」
進化中のニャオハに屈伸煽りすると立つ 「の技見たいに決まってんだろ!見てみろよ!」
進化中のニャオハに屈伸煽りすると立つ 「ニャオハには負けるな、私にも...」
進化中のニャオハに屈伸煽りすると立つ 「この技を使っても倒せない」
進化中のニャオハに屈伸煽りすると立つ 「ああ...」
進化中のニャオハに屈伸煽りすると立つ 「ネコ科になるとこのポーズになる」
進化中のニャオハに屈伸煽りすると立つ 「お前ら全員ヤバい奴だって分かってるんだから」

それっぽくなりましたね!

こんな調子で過去エントリにもセリフをつけてみる 「なるほどなぁ...」

自作したRISC-V向けCコンパイラでセルフホストまでこぎつけた - 詩と創作・思索のひろば

自作したrisc-v向けcコンパイラでセルフホストまでこぎつけた 「すごいなぁ」
自作したrisc-v向けcコンパイラでセルフホストまでこぎつけた 「コンパイラを作ったことある人、ぜひ教えて」
自作したrisc-v向けcコンパイラでセルフホストまでこぎつけた 「何のためにこれをやっているのか」
自作したrisc-v向けcコンパイラでセルフホストまでこぎつけた 「本業をほったらかしにして(笑)」
自作したrisc-v向けcコンパイラでセルフホストまでこぎつけた 「自前の環境構築に手間取ったので、記事としてまとめる」
自作したrisc-v向けcコンパイラでセルフホストまでこぎつけた 「あの時あのコードを書いていれば」
自作したrisc-v向けcコンパイラでセルフホストまでこぎつけた 「コードの可読性は大切」
自作したrisc-v向けcコンパイラでセルフホストまでこぎつけた 「夢のよう」
自作したrisc-v向けcコンパイラでセルフホストまでこぎつけた 「いい時代になったもんだ」
自作したrisc-v向けcコンパイラでセルフホストまでこぎつけた 「気が狂ったかと思った」

Chrome仕事術 - 詩と創作・思索のひろば

chrome仕事術 「デキる人、時間の使い方上手い」
chrome仕事術 「chromeは使いにくいが、dockは最強」
chrome仕事術 「chromeの拡張機能は必要経費だ」
chrome仕事術 「仕事なんて必要ないから早く寝なさい、早く準備して家事を終わらせなさい」
chrome仕事術 「本当にこれがいいんですか?」
chrome仕事術 「chromeにパスワードを保存しておけば、ログインのたびにパスワードを入力しなくてすむので楽」
chrome仕事術 「一度教えられたことは自分で調べる癖をつけないと忘れる」
chrome仕事術 「デコメイラストは一枚描くだけで満足してて全然仕事しないよね」
chrome仕事術 「初心者に優しい設計です」
chrome仕事術 「本当にこれだけでいいのか...」

今年の進捗プログレスバーSVG - 詩と創作・思索のひろば

今年の進捗プログレスバーsvg 「1〜100を表にしてる」
今年の進捗プログレスバーsvg 「このペースでいけば1年後には...
今年の進捗プログレスバーsvg 「いや、あれはあれですごいんだよ」
今年の進捗プログレスバーsvg 「もし、プロジェクト全体が10年以上かけて出来上がっていたら」
今年の進捗プログレスバーsvg 「水星の日は何をしましょうか」
今年の進捗プログレスバーsvg 「来年は月でプログレスバーみたいにしてみようかなぁ」
今年の進捗プログレスバーsvg 「プロジェクトの開始時の進捗は何かを記録する良い指標になる」
今年の進捗プログレスバーsvg 「どこまで進んでいるんだw」
今年の進捗プログレスバーsvg 「こんなに早く結果が出るとは...」
今年の進捗プログレスバーsvg 「やっとこさシステム要件が通って契約書締結できた」

Baba Is You をクリアした - 詩と創作・思索のひろば

baba is you をクリアしたが描いた絵に驚く
baba is you をクリアした
baba is you をクリアしたさんが『#スプラトゥーン2』で「イカれたイカれたプレイ」を披露している
baba is you をクリアした感想...「に落ちた」
baba is you をクリアしたさん
baba is you をクリアしたが「大好き」と言った曲→
baba is you をクリアしたから得るもの
baba is you をクリアしたが最高にカッコイイ
baba is you をクリアしたが「みんながみんなそうじゃないのよ」と言っていた
baba is you をクリアした 「でも全然わからん」

コードレビューのときに見ているところ - 詩と創作・思索のひろば

コードレビューのときに見ているところ 「コードを記述すればきれいなコードを書くことができるが、何も書かないと汚いコードを書くことになる」
コードレビューのときに見ているところ 「今まで気づかなかった」
コードレビューのときに見ているところ 「何でも知っている...」
コードレビューのときに見ているところ 「caffeoのレビューとかで見たやつ。このコード俺も書きたくなった」
コードレビューのときに見ているところ 「本当にこれは勉強になる」
コードレビューのときに見ているところ 「みんなこの検査結果みてどう思う?」
コードレビューのときに見ているところ 「どこが一番良いのか」
コードレビューのときに見ているところ 「なぜそんなにわかるのか?」
コードレビューのときに見ているところ 「コードのバグ報告とコードに対する指摘の違い」
コードレビューのときに見ているところ 「どのコードも大した改善じゃないのに、全員のテストが通るとこを見ると開発のすごさを感じる」

Baba Is You のエントリだけちょっと妙だけど、それ以外は「括弧書きでセリフをつける」というレギュレーションを普通にクリアしている。おそるべし。

実際につかった Colab のノートブック(の一部)はこれ。

https://gist.github.com/motemen/fb8682fcbaca3ea65d73ed8ed885be9d

おまけ: ライブデモ

このエントリで使ったのは medium 版だが、small 版を以下で試せます。そのうち消す。

はてなで一緒に働きませんか?