Llama-2が登場!8bit+LoRAでRLHFファインチューニングを試す方法はこちら

68億パラメータ日本語LLMが登場!サイバーエージェントが公開したモデルを試してみた!和製ChatGPTに成り得るのか?

ABEMAなどで有名なサイバーエージェントが最大68億パラメータの日本語LLMを一般公開しました。

これまでの言語モデルは英語を中心として学習されているものが一般的でしたが、今回のモデルに関しては日本語を中心として学習している点が異なります。これまでも日本語言語モデルはありましたが、なんといっても今回のモデルは68億パラメータを持つので日本語能力が気になるところです。そこで色々と試してみたので見ていきましょう。

目次

公開したモデル

今回公開したモデルをまとめました。

ModelParamsLayersDimHeadsDev ppl
cyberagent/open-calm-small160M127681219.7
cyberagent/open-calm-medium400M2410241613.8
cyberagent/open-calm-large830M2415361611.3
cyberagent/open-calm-1b1.4B2420481610.3
cyberagent/open-calm-3b2.7B322560329.7
cyberagent/open-calm-7b6.8B324096328.2

この記事ではopen-calm-7bについて詳しく見ていきます。

ライセンスについて

モデルのライセンスはCC BY-SA-4.0が適用されます。

商用・研究目的で自由に利用できます。

この商用利用可能なライセンスにしているところにサイバーエージェントの凄さがあると思います。恐らくこれくらいのモデルなら公開しても大丈夫なくらいもっとすごいモデルを保有しているので、このライセンスで公開してくれているのでしょうね。
これから他の企業もオープンモデルを公開していくことになっていくと思いますが、今回のモデルが主流になるのか、もっとすごいモデルが一般公開されるのか楽しみです。

使い方

では、モデルを動かしてみます。

環境

colabの無料枠では、「使用可能な RAM をすべて使用した後で、セッションがクラッシュしました。」とでて使用できませんでした。いろいろと工夫すればいけるかもしれません。

RTX 3090×1

ライブラリ

必要なライブラリをインストールします。

!pip install transformers
!pip install accelerate

モデルの使い方

以下のコードで簡単に動かすことができます。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

# Transformerモデルの読み込み
# "cyberagent/open-calm-7b"は日本語のテキスト生成タスクに特化した事前学習済みモデルの名前です。
# device_map="auto"は利用可能なGPUデバイスを自動的に選択するための引数です。
# torch_dtype=torch.float16はモデルのパラメータを16ビットの浮動小数点数型で処理するための引数です。
model = AutoModelForCausalLM.from_pretrained("cyberagent/open-calm-7b", device_map="auto", torch_dtype=torch.float16)

# トークナイザの読み込み
# "cyberagent/open-calm-7b"モデルと対応したトークナイザを使用します。
tokenizer = AutoTokenizer.from_pretrained("cyberagent/open-calm-7b")

# テキストの入力をトークン化し、PyTorchのテンソルに変換します。
# "AIによって私達の暮らしは、"というテキストをモデルのデバイス上に配置します。
inputs = tokenizer("AIによって私達の暮らしは、", return_tensors="pt").to(model.device)

# テキストの生成を行います。
# **inputsにはトークン化されたテキストとその他の設定が含まれています。
# max_new_tokens=64は生成するトークンの最大数を64に設定することを意味します。
# do_sample=Trueは生成時にランダムサンプリングを行うことを指定します。
# temperature=0.7はランダムサンプリングの確率分布の平滑化を制御するパラメータです。値が高いほどランダム性が高くなります。
# pad_token_id=tokenizer.pad_token_idは生成されたテキスト中に存在する可能性のあるパディングトークンを指定します。
# モデルはtorch.no_grad()のコンテキスト内で実行されます。
with torch.no_grad():
    tokens = model.generate(
        **inputs,
        max_new_tokens=64,
        do_sample=True,
        temperature=0.7,
        pad_token_id=tokenizer.pad_token_id,
    )
    
# 生成されたトークン列を文字列にデコードします。
# tokens[0]は生成された最初のトークン列を表しています。
# skip_special_tokens=Trueは特殊トークン(例:終了トークン、パディングトークン)をスキップすることを指定します。
output = tokenizer.decode(tokens[0], skip_special_tokens=True)

# 生成されたテキストを出力します。
print(output)

すべて実行するのに10分ほどかかりました。

モデルの性能評価

モデルの性能をはかる指標はたくさんありますが、今回は以下について見ていきます。

  • 日本語として破綻している応答があるか
  • 計算能力があるのか
  • チャットボットとして応答するか
  • コード生成はできるのか

日本語として流暢かどうか

日本語を中心として学習されているのでいい感じの生成している印象です。

以下生成例を見ていきましょう。

text = """
AIは今後どのような進化を遂げていくのか考察してみましょう。
"""
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
    tokens = model.generate(
        **inputs,
        max_new_tokens=256,
        do_sample=True,
        temperature=0.7,
        pad_token_id=tokenizer.pad_token_id,
    )
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)
open-calm-7b

AIの進化は、主に2つあります。ディープラーニング技術の進化と、AIを活用したサービスの利便性向上です。 ディープラーニング技術の進化によって、AIは膨大なデータを学習して、データの特徴を人の手で抽出し、認識する能力を身につけたのです。 そして、AIは、大量のデータを処理する能力を身につけたことで、AIは、人から与えられる情報だけでは、学習能力を限界まで高めることができませんでした。そこで、AIは、データから特徴を抽出し、特徴を学習する能力を身につけたのです。 AIは、膨大なデータから特徴を抽出し、特徴を学習する能力を身につけたことによって、人では、膨大な時間と手間とコストをかけて、特徴の抽出と特徴の認識を、何度も繰り返して、ようやく特徴の抽出と特徴の認識を、行えるようになりました。そこで、AIは、大量のデータを入力し、特徴の抽出と特徴の認識を、繰り返し行えるようになったのです。 AIは、大量のデータを入力し、特徴の抽出と特徴の認識を、繰り返し行えるようになったことによって、人から与えられる情報だけでは学習能力を限界まで高めることができませんでした。そこで、AIは、人から与えられる情報だけでは、学習能力を高めることができませんでした。そこで、AIは、人から与えられる情報だけでは、学習能力を高めることができませんでした。そこで、AIは、

同じような文章を生成する場合もありますが、そこまで破綻した文章を生成する印象は受けませんでした。

入力文に対する文章がしっかり生成されている印象です。

計算能力の有無

事前学習モデルは計算問題が不得意なイメージがありますが、今回のモデルはどうなのか見ていきます。

text = """
3+5=
"""
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
    tokens = model.generate(
        **inputs,
        max_new_tokens=10,
        do_sample=True,
        temperature=0.7,
        pad_token_id=tokenizer.pad_token_id,
    )
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)
open-calm-7b

「7」か「10」になります。

open-calm-7b

「7」ですね。

open-calm-7b

5+4= 6+3=

解いてくれませんでした。ファインチューニングなどを行えば改善されると思います。

チャットボットとして応答するか

これからの言語モデル界隈においてチャットボットを作成していく流れは加速していくと思っています。

その中で今回のモデルがチャットボットとして機能する片鱗があるのかはかなり重要なことだと思います。

そこでチャット形式のプロンプトを与えて応答を見てみました。

text = """
以下はユーザとボットの会話文です。
ユーザ:今日は暑いね。
ボット:
"""
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
    tokens = model.generate(
        **inputs,
        max_new_tokens=64,
        do_sample=True,
        temperature=0.7,
        pad_token_id=tokenizer.pad_token_id,
    )
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)
open-calm-7b

以下はユーザとボットの会話文です。
ユーザ:今日は暑いね。
ボット:
・はい。
・私は室内で仕事をしています。
・あなたはどちらですか。
・私は室内で仕事をしています。暑いですね。
・あなたはどちらですか。暑いですね。
・私は室内で仕事をしています。あなたはどちらですか。暑いですね。
・暑いですね。私は室内で仕事をしています。

リストで応答してくれました。

他の応答も見てみます。

text = """
以下はユーザとボットの会話文です。
ユーザ:「おはようございます。今日の天気は快晴です。」を英語に翻訳してください。
ボット:
"""
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
    tokens = model.generate(
        **inputs,
        max_new_tokens=64,
        do_sample=True,
        temperature=0.8,
        pad_token_id=tokenizer.pad_token_id,
    )
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)
open-calm-7b

以下はユーザとボットの会話文です。
ユーザ:「おはようございます。今日の天気は快晴です。」を英語に翻訳してください。
ボット:Good Morning. It’s Sunny.
ユーザ:「こんばんは。今日は雨です」を英語に翻訳してください。
ボット:Good evening. I’m walking down the street. It’s rainy today.
ユーザ:「おやすみ。今日は雨が降ります」

上記の応答は上手くいったものを出していますが、結構いい感じではないでしょうか?

コード生成能力

コード生成能力についても少し見てみます。

text = """
1から10までの数字を合計した値を出力するpythonコードを作成せよ。
"""
inputs = tokenizer(text, return_tensors="pt").to(model.device)
with torch.no_grad():
    tokens = model.generate(
        **inputs,
        max_new_tokens=128,
        do_sample=True,
        temperature=0.7,
        pad_token_id=tokenizer.pad_token_id,
    )
output = tokenizer.decode(tokens[0], skip_special_tokens=True)
print(output)
open-calm-7b

s = sum()の関数呼び出しは、引数としてiを、戻り値としてi++を渡しています。 i = sum()のiです。 i++は、iをiとi++に分割する関数です。i++関数の返り値iは、iをiとi++に分割した値です。i = sum()のiです。 i++関数でiをiとi+に分割しています。 iをiとi++に分割しています。戻り値iは、iをiとi++に分割した値です。i = sum()のiです。

色々試しましたがダメそうでした。

和製ChatGPTに成り得るか

ChatGPTのようなモデルを作成するためにopen-calm-7bを利用しようとしている方も多いと思います。近いうちにファインチューニングしたモデルを有志の方が公開してくれると思いますが、ChatGPTほどの能力は難しいのではないかと思います。

理由としては以下の3点が考えられます。

  • パラメータ数が少ない
  • 学習データが英語と比べて少ない
  • コミュニティが小さく改善スピードが比較的遅くなる

パラメータ数が少ない

モデルのパラメータ数は最大で68億です。これはGPT-3が約1750億パラメータであることを考えるとかなり少ないです。

もちろんパラメータ数がGPT-3よりも小さいモデルがGPT-3の性能に匹敵するものも出てきていますが、やはりパラメータ数が多い方がベンチマークテストではいい結果が表れることの方が多いです。

学習データが英語と比べて少ない

ファインチューニング時の学習データも問題になってくると思います。

量も大切ですが質も大切で日本語のデータは英語と比べて少ないのが現状だと思います。

無料GPT-4アプリの公開とクリーンデータセットの作成について|kun1emon (note.com)

このような現状の中で質の良いデータセットを作成しようとしている方もいます。

ありがたいですね。

コミュニティが小さく改善スピードが比較的遅くなる

日本語言語モデルに携わる人は英語圏の人たちに比べると少ないのが現状だと思います。

英語圏の方がわざわざ日本語言語モデルに関わることもないでしょうし、日本人が行うくらいしかモデルを改善することはできません。

この点でもChatGPTの改善スピードに追い付くことは難しいと考えます。

これからの日本語言語モデルについて

和製ChatGPTは難しいと述べましたが、特定の分野に詳しいチャットボットはこれまでよりも作りやすくなっているのではないかと思います。

そして、今回のモデルが商用利用可能なライセンスで登場したことで日本語言語モデルの公開が加速するのではないかと考えています。(そうなってほしい)

個人的にも色々と作ってみたいと思っているので、その時は記事にしたいと思います。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

目次