黒住 好忠
こんにちは。テクニカルスペシャリストの黒住です。
最近では「AI」という言葉も広く使われるようになり、一部では、文系理系を問わず「共通的な必須知識」としてAIが必修になっている大学もあるようです。その一方で「実際にAIを活用する」という部分については、ほとんどの人が手を出せていない・・・というのが実状だと思います。
そこで今回は、「無料で利用できる事前学習済のAIモデル」使って「数十行のコードでAIプログラムが作成できる」という点をご紹介します。ひとくちにAIと言っても様々な種類が存在するのですが、今回は応用範囲の広い「人間の言葉を扱うAI」を「2種類」作成してみたいと思います。AIの分野では、自然言語処理(NLP:Natural Language Processing)と呼ばれる領域になります。
文章の続きを自動生成するAI
まずは「文章の続きを自動生成」するAIプログラムを作成してみましょう。例えば、「日本で一番高い山は富士山ですが」と入力すれば、後に続く文章を自動で考えてくれるAIになります。
文章を書いていて続きの文章が思い浮かばない場合や、特定の質問に対するヒントを得たい場合、バリエーション豊かな文章からインスピレーションを得たい場合など、多くのシーンで活用できそうですね。
文章生成プログラムのソースコード
今回は「無料で利用できる事前学習済みのAIモデル」を利用する前提のため、「HuggingFaceのTransformers」というライブラリを使用します。TransformersはTensorFlowやPyTorchなどの主要フレームワークに対応しているのですが、以下のサンプルではPyTorchを利用しています。
Transformersを使えば、たった数十行のコードで文章生成のプログラムが作成できます。Transformersは様々な学習済モデル(人間で言う頭脳みたいなもの)が選択できるようになっているので、文章生成では「事前に日本語文章で学習してある rinna/japanese-gpt-1b」というモデルを使っています。(GPT-2ベースのモデル)
以下のコードは、「日本の朝食では味噌汁が定番ですが、」に続く文章を、5つ生成するプログラムになります。ポイントが分かりやすいように関数化などは行っていませんが、コード中の「日本の朝食では味噌汁が定番ですが、」という部分を書き換えれば、入力する文章を簡単に変更できます。
import torch
from transformers import T5Tokenizer, AutoModelForCausalLM
# tokenizerとmodelの準備(GPUが使える場合は利用する)
= "rinna/japanese-gpt-1b"
model_name = T5Tokenizer.from_pretrained(model_name)
tokenizer = AutoModelForCausalLM.from_pretrained(model_name)
model
if torch.cuda.is_available():
= model.to("cuda")
model
# 入力文章の準備
= "日本の朝食では味噌汁が定番ですが、"
text = tokenizer.encode(text, add_special_tokens=False, return_tensors="pt")
input_ids
# 入力文章から、後続の文章を推論
with torch.inference_mode():
= model.generate(
output_ids
input_ids.to(model.device),=300,
max_length=5,
min_length=True,
do_sample=500,
top_k=0.75,
top_p=5,
num_return_sequences=tokenizer.pad_token_id,
pad_token_id=tokenizer.bos_token_id,
bos_token_id=tokenizer.eos_token_id,
eos_token_id
)
# 推論した文章を分かりやすく表示
= tokenizer.batch_decode(output_ids, skip_special_tokens=True)
output_texts output_texts
乱数値を固定していないので、生成される文章は毎回異なりますが、上記コードを実行すると以下のような文章が生成されます。少し微妙な文章も含まれていますが、ある程度自然な文章が生成されていますね。
- 日本の朝食では味噌汁が定番ですが、お味噌汁には、実は健康効果や美容効果があるんですよ。今回は、そんな味噌汁の知られざる健康効果や美容効果について、詳しくご紹介します。
- 日本の朝食では味噌汁が定番ですが、この味噌汁はインスタントでは出せない、本物の味です。
- 日本の朝食では味噌汁が定番ですが、欧米では「お味噌汁」の文化があまりないですよね。
- 日本の朝食では味噌汁が定番ですが、海外ではあまり飲まれていません。
- 日本の朝食では味噌汁が定番ですが、朝食に味噌汁は合わないです。
model.generator()のパラメーター調整
文章を生成する model.generate() には様々なパラメーターが存在しており、パラメーター経由で生成文章の細かい制御が可能になります。ここで全てのパラメーターを紹介することはできませんが、使用頻度が多いと思われるパラメーターをいくつか紹介したいと思います。
top_p(生成される文章の複雑さに影響)
「top_p」の値を「0.0≦top_p<1.0」の範囲で変更すると、文章の複雑さが変化します。実際には、top_kなど他のパラメーターの影響も受けるのですが、基本的には「top_pの値を小さくするとシンプルな文章、値を大きくすると複雑な文章」が生成されるようになります。(複雑な文章というのは、難解な文章という意味では無く「利用されるボキャブラリーの幅が広がる」ようなイメージになります)
▼top_p = 0.1(シンプルな文章になる→シンプルなので内容が重複する場合もある)
- 日本の朝食では味噌汁が定番ですが、味噌汁は、大豆を原料とした発酵食品です。
- 日本の朝食では味噌汁が定番ですが、味噌汁は塩分が多く、高血圧や動脈硬化の原因になります。
- 日本の朝食では味噌汁が定番ですが、味噌汁は日本人にとってなくてはならない存在です。
▼top_p = 0.99(語彙のバリエーションの幅が増える→複雑な文章になる)
- 日本の朝食では味噌汁が定番ですが、イタリアやスペインの場合、各家庭や中庭で朝食を摂る習慣があるため、食堂は朝よりも昼から夜にかけて賑わいをみせています。
- 日本の朝食では味噌汁が定番ですが、皆さんはしっかり汁物を作りますか? 以前は、お味噌汁をきっちり作っていた人はあまり多くありませんでした。 ですが、日本の食生活が欧米化して、朝食のレパートリーも増えたことで、味噌汁も徐々にブームとなりつつあります。 炊きたてのお米に美味しい味噌汁をあたえることで、朝の目覚めが良くなり、脳もアクティブに働きます。 また、身体の調子を整えて食べ始めることは、ダイエットにも効果的です。 ダイエット効果があることはダイエットのプロの方々も認めていて、よく、味噌汁を使ったある方法で、1日のカロリー摂取量をコントロールしていました。 そこで、和食をベースとしたダイエットメニューで、効果的に痩せられる味噌汁ダイエットをご紹介します。
- 日本の朝食では味噌汁が定番ですが、最近はインスタントやレトルトなどの味噌汁が多く、本物の味噌汁を味わう機会は減少しているように思えます。普段何気なく口にする「漬物」も「ぬか漬け」は、健康や美容によいことはわかっていても、あの独特のにおいと粘っこさが食が進むものではありません。昔ながらの美味しいかぼちゃの浅漬けは、抗酸化作用のあるポリフェノールや、口さみしくなりがちな御飯のお供としてはもちろん、食物繊維たっぷりの栄養バランスも良く、女性を中心に人気を集めている野菜です。「かぼちゃの浅漬け」のような伝統野菜が、もっとみなさんに愛されるようになるよう、もっと多くの方に「健康」に関心を持っていただけるよう、野菜・果物づくりの他、お店作りの研究や販売促進にも取り組んでいます。
min_length(最低でも書いて欲しい文章の長さを指定)
試験問題などで「小論文は○○文字以上」・・・という制約を見かけることがありますが、それに近いパラメーターが「min_length」になります。この値を指定すると「必ずmin_lengthで指定された長さ以上の文章」が生成されるようになります。なお、min_lengthに指定する数は「トークン(文章を構成する単語数のようなもの)に関する長さ」であり、文字数ではないのでご注意ください。
ただし、文章が長くなると「全体の整合性がとれていない文章になる」可能性が高くなるため、あまりにも長い文章を生成することはお薦めしません。
▼min_length=200、max_length=600(最低でも200トークン以上の長い文章)
- 日本の朝食では味噌汁が定番ですが、海外の食卓ではお味噌汁は滅多に見かけません。では、海外ではお味噌汁は飲まれていないのでしょうか?そんなことはありません。海外でも日本と同じように、お味噌汁は人気です。海外のお味噌汁の具は、日本と同じものが多いようです。たとえば、キャベツや豆腐、ほうれん草などの野菜を具にしたお味噌汁が多く、マヨネーズやケチャップ、醤油などで味付けされているものも少なくありません。海外のホテルやレストランでは、日本のお味噌汁も出すところが多く、日本人にとって海外での外食での和食は、安心して楽しめるものではないでしょうか。
お味噌汁の具にも日本ならではのものがたくさんありますので、ぜひ色々な具で試してみてくださいね。お味噌汁にも様々な作り方があります。ここではお味噌汁の作り方の種類をご紹介します。ぜひお味噌汁作りの参考にしてくださいね。
【お味噌汁の作り方】1.お米を研ぐ2.鍋に水を張り、お米を研いだ米と昆布を入れて軽く洗い、30分以上おく3.お米を鍋に入れて沸騰したら火を止めておく4.沸騰したら火を止めて、昆布を取り出す5.出汁を取る6.出汁を鍋に入れ、火にかける7.出汁が沸騰したら火を止め、味噌を入れて溶かしながら弱火で15分ほど煮る8.火を止め、具を入れる9.火を止め、出汁を入れる10.火を止め、具をほぐす11.味噌を入れて溶かす12.具を入れ、弱火で20分ほど煮る13.火を止め、蓋をして20分蒸らす14.火を止め、味噌を溶かす15.蓋を開け、味噌を溶かす16.器に盛り付ける
※ここで紹介する作り方は、お味噌汁の具が米だけの場合です。お味噌汁の具に色々なものを入れる場合は、具材に合わせたお味噌汁の作り方を参考になさってください。 - 日本の朝食では味噌汁が定番ですが、米国ではパンにバターを塗り、ミルクティーと一緒に頂くのが一般的です。そんなミルクティーの茶葉に、実は様々な効果・効能があります。今回は、ミルクティーに含まれる成分とその効果について紹介していきたいと思います。ミルクティーの効果・効能は? ミルクティーはミルクとお茶が一緒に配合されているので、乳製品に多いビタミンやミネラルが豊富に含まれており、体の内側から健康にしてくれます。
このことから、ミルクティーは「ヘルシーティー」と呼ばれており、女性の美と健康に非常に効果が高いと言えます。また、ミルクティーのダイエット効果についても、以下の記事で詳しく紹介していますので、ぜひ参考にしてみてください。
ミルクティーで痩せる!?おすすめの飲み方3選 授乳中のママは、子供のことを考えて、どうしてもカフェインを控えたいですよね。しかし、カフェインの過剰摂取は、赤ちゃんにとって良くありません。しかし、ミルクティーは飲みやすいため、積極的に飲みたいと考えているママもいるのではないでしょうか。そこで、ミルクティーとカフェインの関係性について紹介します。 ミルクティーとカフェインの関係性 ミルクティーに含まれるカフェインは、コーヒーの10分の1程度しか含まれていません。
そのため、通常のコーヒーを1日に3~4杯飲んでいるような方は、カフェインの過剰摂取となり、母乳の出が悪くなる恐れがあります。
しかし、ミルクティーなら、カフェイン量が少なく、赤ちゃんも安心して飲むことができます。ミルクティーに含まれる成分で母乳の出が良くなる理由 ミルクティーに含まれるカフェインは、母乳を作り出すために必要なホルモンの「プロラクチン」を増加させる働きがあります。そのため、ミルクティーを飲むと、母乳の生成が促進され、母乳の出が良くなるのです。
また、母乳の分泌量を増やすだけでなく、妊娠中の貧血予防や、母乳の出を良くする効果もあります。さらに、母乳の出を良くする以外にも、ミルクティーには、乳がんの予防にも効果があると言われています。
他にも、乳がんの予防に効果があると言われている成分は、以下の記事で詳しく紹介していますので、ぜひ参考にしてみてください。 ミルクティーでニキビはできるの?ミルクティーには、体を温める効果や、乳腺を発達させる効果があると言われています。そのため、体を温めながらミルクティーを飲むことで、冷え性やむくみの解消にもつながります。
しかし、ただミルクティーを飲んでいるだけでは、効果がない場合もあります。ミルクティーを飲んだあとにニキビができてしまった方は、そのミルクティーが体に合っていない可能性があるので、飲むのを中止するようにしましょう。
上記のサンプルを見ていただけると分かるのですが、最初の「レシピ」が出てくる文章は、途中からおかしな状態になっていますね。味噌汁のレシピなのに、ご飯の炊き方なども混在していたり、同じような工程が何度も登場するようになっています。
入力した文章と自動生成された後続文章の例
上記サンプルでは「日本の朝食では味噌汁が定番ですが」に続く文章を自動生成していましたが、他の入力に対する結果もいくつか紹介したいと思います。それぞれ、文頭のカギ括弧(『~』)で囲った部分が「入力した文章」、それ以降が「自動生成された文章」になります。
- 『焼き肉の魅力と言えば、』 お肉だけではありません。サイドメニューも豊富です。ビールとの相性も抜群な「キムチ盛り合わせ」。
特製ダレで漬け込んだ「キムチ牛タン焼き」。白ご飯がすすむ「焼野菜」と「ナムル盛り合わせ」など、お酒が進むメニューが勢ぞろい!ビールだけでなく、ワインや焼酎、ハイボールなどアルコールメニューも豊富です。 - 『今日の夕飯は』 オムライスです。
- 『日本とアメリカの首都は』 ワシントンで、面積では日本の半分ほどしかありません。
- 『あなたは誰ですか?…と聞かれると、』 困ってしまいますね。
- 『生麦・生米・生卵』 ・生肉・生卵(乳製品)など、食中毒を引き起こす可能性のある食品の持ち込みは禁止です。
- 『今後、2030年に向けて急速に伸びてくるのは』 「高齢者介護」と「新興国の伸び」だろう。人口の高齢化は、健康や寿命の延長をもたらすと同時に、社会的な役割や負担の増大をももたらす。
しかし、少子高齢化によって労働人口が減少している日本において、これまでのように、労働者人口や労働力人口といった人的リソースに依存した制度や制度を支える仕組みだけでは、限界が来ると考えられる。
高齢化の進む先進諸国だけでなく、少子化が進む新興国においても、健康寿命の延伸や福祉の向上を、労働人口に過度に依存しない仕組みや仕組みをいかにして構築していくかが、課題となっていく。 - 『DX推進の先にあるものは、』 日本の企業のさらなる発展です。DX推進は、様々な問題を発見し、解決できる体制を作ることに他なりません。問題を発見し、解決できる体制を作り上げるには、多様な視点が求められます。
また、問題発見し、解決できる体制を作るには、解決すべき課題に対して明確なビジョンを持つことが重要です。つまり、DX推進は、DXを推進するチームを作り上げることに他なりません。このチームがしっかりと機能することが、DXの推進を実現できる基盤になると考えています。
自動生成された文章を読んでいただけると分かると思いますが、文章のつながりは自然でも、内容が必ずしも正しいとは限りません。例えば、「日本とアメリカの首都は→ワシントン」となっていますが、日本の首都はワシントンではないですよね。その一方で、「2030年に向けて急速に伸びてくるのは~」、「DX推進の先にあるものは~」という文章に対しては、なかなか説得力のある文章が生成できています。
自動生成される文章は「事前学習に使われたデータ」の影響を受けやすくなるため、日本語文章の学習に使われたWikipediaなどの情報が反映されやすくなっています。
写真に合致する説明文を判断するAI
続いて、「写真に合致する、適切な説明文を判断」するAIを作ってみましょう。
意味が分かりづらいかもしれませんが、例えば、以下のような犬の写真を見せられて、この写真を最も適切に表現しているのは「犬、猫、馬」のどれでしょうか?・・・と質問されれば「犬」と答え、選択肢が「草原で座っている、川で泳いでいる、空を飛んでいる、餌を食べている」なら「草原で座っている」、「赤、青、緑」なら「緑」・・・と答えるようなAIを作成します。
類似するAIとして「画像に写っている物を識別する、画像のクラス分類」が存在しますが、今回作成するAIは、画像のクラス分類とは少し異なります。
クラス分類は、あらかじめクラスの種類(犬、猫、鳥など)を決めておき、対象の写真が「どのクラスに該当するか」を判断する処理になりますが、ここで作成するAIは「自由に書かれた説明文の中から、画像に最も適している内容を答える」という処理になります。
つまり「事前に選択肢の内容は決まっておらず」、同じ写真であっても、動物の種類(犬、猫、鳥)、写真の色(赤、青、緑)、雰囲気(楽しい、悲しい)、姿勢(立っている、座っている、寝ている)等々、さまざまな切り口での解釈が存在するため、その都度、「画像と文章の意味合いの関係性」などを探りながら判断を下す必要があるのです。
写真に合致する文章を判断するプログラムのソースコード
複雑そうに見える処理ですが、こちらも数十行のコードで簡単に実装可能です。
ここで利用する「rinna/japanese-cloob-vit-b-16」というモデルも、あらかじめ、CC12Mという「大量の写真と、その日本語説明文」を元に事前学習が行われているため、一般的な写真であれば、最初から「画像と言葉の意味を理解できる」ような状態になっているのです。とても、便利な世の中になりましたね。
from PIL import Image
import torch
import japanese_clip as ja_clip
# 事前準備
= "cuda" if torch.cuda.is_available() else "cpu"
device = ja_clip.load("rinna/japanese-cloob-vit-b-16", device=device)
model, preprocess = ja_clip.load_tokenizer()
tokenizer
# 画像ファイルの読み込み
= Image.open("./data/dog.jpg")
img = preprocess(img).unsqueeze(0).to(device)
image
# 選択肢の文章を準備
= ["犬", "猫", "馬"]
values = ja_clip.tokenize(
encodings =values,
texts=200,
max_seq_len=device,
device=tokenizer,
tokenizer
)
# 適切な選択肢を推論
with torch.inference_mode():
= model.get_image_features(image)
image_features = model.get_text_features(**encodings)
text_features = (image_features @ text_features.T).softmax(dim=-1)
text_probs
# 推論結果を分かりやすく表示
= zip(values, text_probs.flatten().tolist())
pairs for pair in pairs:
print(f"{pair[0]}\t: {pair[1]:.2%}")
判断する画像を変更したい場合は「./data/dog.jpg」部分のファイル名を変更してください。また、選択肢の文章は「[“犬”, “猫”, “馬”]」という部分で変更できます。選択肢の数や文字数複数設定できるので、[”座っている”,”眠っている”,”笑っている”,”隠れている”]など、自由に設定して試してみてくださいね。
上記のコードを実行実行すると、各選択肢ごとの「写真の説明として正しいと思われる確率」を表示できるようにしています。例えば、上記サンプルコードでは「犬:99.97%、猫:0%、馬:0.02%」の確立となり、渡された選択肢の中では「犬」が99.97%の確率で、最も適した説明だと判断されます。
さまざまな画像と選択肢による判断結果
上記サンプルでは「犬の写真」と「犬・猫・馬」という選択肢の組合せでしたが、他の写真や選択肢の結果がどうなるかについても、いくつか紹介したいと思います。なお、最も確率の高かった選択肢には「★」マークを付けて見やすくしています。
犬の写真
- 動物の種類の選択肢
- 犬 : 99.95% ★
- 猫 : 0.00%
- 馬 : 0.02%
- 鳥 : 0.02%
- 猿 : 0.00%
- 写真のイメージや感情の選択肢
- 明るい : 83.93% ★
- 暗い : 8.00%
- 楽しい : 1.45%
- 悲しい : 6.63%
- 色に関する選択肢
- 赤 : 11.09%
- 青 : 2.70%
- 緑 : 86.21% ★
船で釣りをしている写真
- 乗り物に関する選択肢
- ボート : 99.72% ★
- 車 : 0.21%
- 飛行機 : 0.06%
- 電車 : 0.01%
- イメージ色の選択肢
- 暖かい色 : 5.34%
- 冷たい色 : 94.66% ★
- 状況を表す選択肢
- 川で泳いでいる : 0.00%
- 岸で釣りをしている : 0.00%
- 船で釣りをしている : 100.00% ★
- 雰囲気や感情を表す選択肢
- 明るい : 99.54% ★
- 暗い : 0.04%
- 楽しい : 0.34%
- 悲しい : 0.08%
- 服の色を表す選択肢
- 白い服 : 84.25% ★
- 青い服 : 0.87%
- 赤い服 : 14.77%
- 黒い服 : 0.11%
- 姿勢などの状態を表す選択肢
- 立っている : 69.55% ★
- 座っている : 30.17%
- 寝ている : 0.04%
- 泳いでいる : 0.23%
キッチンで料理をしている写真
- 動作を表す選択肢
- 料理をしている : 99.99% ★
- 食事をしている : 0.01%
- 片付けをしている : 0.00%
- 運動している : 0.00%
- 電話している : 0.00%
- 場所に関する選択肢
- キッチン : 99.93% ★
- リビング : 0.01%
- バスルーム : 0.05%
- バルコニー : 0.01%
- 料理の種類に関する選択肢
- 肉料理 : 7.77%
- 魚料理 : 5.70%
- 野菜料理 : 86.53% ★
- 空間の広さに関する選択肢
- 狭い空間 : 25.50%
- 広い空間 : 74.50% ★
- 部屋の様子を表す選択肢
- 清潔な部屋 : 84.37% ★
- 汚い部屋 : 12.55%
- 古い部屋 : 3.08%
バーベキューで肉を焼いている写真
- 食材に関する選択肢
- 肉料理 : 71.34% ★
- 魚料理 : 28.64%
- 野菜料理 : 0.02%
- 映っている物に関する選択肢
- フルーツが映っている : 0.00%
- 野菜が映っている : 0.00%
- 肉と野菜が映っている : 0.40%
- 肉が映っている : 99.60% ★
- 感覚に関する選択肢
- 熱い : 98.13% ★
- 冷たい : 1.87%
- 調理方法に関する選択肢
- 焼く : 97.20% ★
- 煮る : 0.00%
- 蒸す : 0.00%
- 茹でる : 0.00%
- 炒める : 0.15%
- 揚げる : 2.65%
- 味に関する選択肢
- 辛い味 : 0.53%
- 酸っぱい味 : 1.01%
- 苦い味 : 98.35%(※おそらく焦げていて苦いと判断された) ★
- 渋い味 : 0.11%
ミーティングの写真
- 状況を表す選択肢
- 会社で仕事をしている : 0.00%
- 会議室で打ち合わせをしている : 99.79% ★
- 自宅でオンライン会議をしている : 0.21%
- 部屋の雰囲気に関する選択肢
- 明るい日差しが差し込む部屋 : 87.23% ★
- 窓のない暗い部屋 : 1.69%
- カラフルな壁紙の部屋 : 11.09%
- 連想する言葉の選択肢
- 料理 : 1.48%
- 仕事 : 97.20% ★
- 工作 : 0.99%
- 製造 : 0.01%
- 運動 : 0.02%
- 休憩 : 0.30%
結果を見ていただけると分かると思いますが、色々な切り口の選択肢に対して、良い感じの精度で適切な選択肢が選択できているように見えます。バーベキューの肉の写真では、味を「苦い」と判断したようですが、おそらく「黒く焦げている→苦い」と判断されてしまったようですね。
上記の例では正しく判断されたケースが多くなっていますが、この判断も「事前学習で利用されたデータ」の影響を受けているという点にはご注意ください。つまり、学習に使われた「写真と、そこに書かれている説明文」を元に意味なども理解しているので、学習データに含まれていない概念については、正しく判断することができません。
さらなるステップアップに向けて
上記では、事前学習済のAIモデルを使って、簡単にAIプログラムを作成する方法を紹介しました。
このような「事前学習済みモデル」は手軽に利用できる一方で、業務などの特定ドメイン(業務に特化した領域など)においては、十分な精度を発揮できないケースも数多く発生します。これは、事前学習に利用されたデータでは、業務範囲をカバーしきれない事が大きな原因です。(人間で言えば、一般的な知識は持ち合わせていても、業務に特化した知識は習得できていない状態)
このような場合、人間であれば「必要な業務知識を追加で覚えれば、実業務でも対応できるようになる」のですが、実はAIの世界でも、同じような考え方があります。
その一つが「ファインチューニング」と呼ばれる手法で、事前学習したモデルをベースに「新たに必要な知識だけ、追加で学習させる」というような手法になります。ファインチューニングを使えば、追加で必要な部分だけを教育すれば良いので、学習に必要なコストも大きく抑えることが可能になります。
ページ数の都合などもあり、ファインチューニングの詳細については割愛しておりますが、機会があれば、またどこかでご紹介したいと思います。
それではまた、次回のコラムでお会いしましょう。
リンク集
上記で紹介したフレームワークやライブラリ等のリンクを以下にまとめています。(いずれも外部リンク)
- ディープラーニングの有名なフレームワーク
- NLPライブラリ、事前学習済モデルなど
- 商用利用可能なストックフォトサービス