日本語ウェブページの教育的価値を判定する分類器「tokyotech-llm/edu-classifier」を試す
モデル
日本語READMEはこちら
Swallow Education Classifier
概要
日本語ウェブページの教育的価値を判定する fastText 分類器です。本リポジトリには学術カテゴリに属する日本語 Wikipedia テキストを基に訓練された分類器(Wiki-based classifier)と、LLM による自動アノテーションを基に訓練された分類器(LLM-based classifier)が含まれます。前者はCC BY-SA 4.0、後者は自動アノテーションに利用した LLM から継承されるライセンス(Llama 3.1 Community License Agreement、もしくはGemma Terms of Use)で利用できます。
これらの分類器は、Swallow コーパス v2* の品質フィルタリングに採用され、Llama 3.1 Swallowシリーズの訓練に用いられました。実験では、分類器のスコアに基づくフィルタリングの適用により、同等の計算規模の学習で、LLM の日本語知識をより効果的に向上できることを確認しました。
注意:日本語テキストに対して動作するように設計されています。英語を含めて、日本語以外の言語での動作や品質は保証しません。
- Common Crawl 由来の大規模日本語コーパス
使用法
Wiki-based classifier は与えられた文書が Wikipedia らしいかどうかを 0〜1 の確率で出力します。一方、LLM-based classifier は与えられた文書の教育的スコアが 0、1、2、3 のいずれに属するかどうかを 4 ラベル分類問題として予測します。各ラベルの予測確率に基づくスコアの期待値(0〜3)を最終的なスコアとして用いることができます。
自分はFastTextを良く知らないのだが、テキスト分類や埋め込み等を行うFacebook製のライブラリで、GPUではなくCPUで動かすものらしい。
FastText
FAQにも以下とある
GPU上でfastTextプログラムを実行することはできますか?
現時点では、fastTextはCPUでのみ動作します。fastTextの目標のひとつは、GPUを必要とせずにモデルをトレーニングできる効率的なCPUツールとなることです。
ということで、Colaboratory CPUで試す。ただし、自分が試した感じだと、2つある分類器を両方ロードするとメモリ不足でクラッシュするので、ハイメモリを有効にしておく。
パッケージインストール。
!pip install numpy==1.26.4 fasttext
サンプルのテキストを指定。
from huggingface_hub import hf_hub_download
import fasttext
text = "Llama 3.1 Swallow\nLlama 3.1 SwallowはLlama 3.1の英語の能力を維持しながら、日本語の能力を強化した大規模言語モデル (8B, 70B) です。"
text = text.replace("\n", " ")
上記の通り分類器は2つあるので、それぞれで試してみる。
まず、Wiki-based classifier。
# Wiki-based classifierを使用する場合
model = fasttext.load_model(
hf_hub_download("tokyotech-llm/edu-classifier", "wiki.bin")
)
res = model.predict(text, k=-1)
## 正例の予測確率を教育的スコアとみなす
edu_score = res[1][0] if res[0][0] == "__label__pos" else 1 - res[1][0]
print(f"Wiki-based score: {edu_score}")
0.017167747020721436
こちらは、Wikipedia らしいかどうか?を 0〜1 の確率で出力するということなので、今回の文章は「Wikipediaっぽくない」ということになる。
ただ、この「Wikipediaらしさ」というのは、
Wikipedia 記事を教育的な文書の正例と見なし、分類器を構築しました。人物に関する記事など、必ずしも教養的とは言えない記事もあるため、学術分野のカテゴリに属する日本語 Wikipedia 記事 37,399 件を抽出し、訓練データの正例としました。また、負例は Swallow コーパス v2 からランダムにサンプリングした文書 37,399 件としました。
ということなので、READMEにあるのだが、
多様な文書に適切なスコアを付与したい場合には、LLM-based classifier の使用を推奨します。Wiki-based classifier は Wikipedia らしさを測定するため、有用と判定される文書の範囲が限定され、ほとんどの文書に 0 付近のスコアを付与する傾向にあります。一方、LLM-based classifier は一般的な教育的価値の定義に基づき、より広範囲な文書に対して採点できます。
ということらしい。なるほど。
ではLLM-based classifierも試してみる。
# LLM-based classifierを使用する場合
model = fasttext.load_model(
hf_hub_download("tokyotech-llm/edu-classifier", "llm_llama.bin")
)
res = model.predict(text, k=-1)
## 各スコアの予測確率の期待値を教育的スコアとみなす
edu_score = sum([int(label[-1]) * prob for label, prob in zip(res[0], res[1])])
print(f"LLM-based score: {edu_score}")
LLM-based score: 1.0000173490607267
こちらは「教育的かどうか?」を0〜3で表す。3に近いほど教育的と考えて良さそう。今回の結果だと、全く教育的な要素を含まないわけではないが教育的とは言えないという感じかな。
違う文章で比較してみる。
from huggingface_hub import hf_hub_download
import fasttext
class EduClassifier:
"""
日本語の教育的価値を判定する fastText 分類器 (Wiki-based / LLM-based) のラッパークラス。
- 初期化時に fastText モデルをロード
- get_scores() でテキストのスコアを取得
"""
def __init__(self):
""" モデルをロードして初期化 """
self.wiki_model = fasttext.load_model(hf_hub_download("tokyotech-llm/edu-classifier", "wiki.bin"))
self.llm_model = fasttext.load_model(hf_hub_download("tokyotech-llm/edu-classifier", "llm_llama.bin"))
def get_scores(self, text):
"""
テキストの教育的価値スコアを取得する。
Args:
text (str): 評価対象のテキスト。
Returns:
dict: Wiki-based classifier と LLM-based classifier のスコアを含む辞書。
"""
text = text.replace("\n", " ") # 改行をスペースに置換
# Wiki-based classifier のスコア取得
wiki_res = self.wiki_model.predict(text, k=-1)
wiki_score = wiki_res[1][0] if wiki_res[0][0] == "__label__pos" else 1 - wiki_res[1][0]
# LLM-based classifier のスコア取得
llm_res = self.llm_model.predict(text, k=-1)
llm_score = sum([int(label[-1]) * prob for label, prob in zip(llm_res[0], llm_res[1])])
return {
"wiki_score": wiki_score,
"llm_score": llm_score
}
classifier = EduClassifier()
以下を使用
# wikipediaの「相対性理論」の冒頭
# ref: https://ja.wikipedia.org/wiki/%E7%9B%B8%E5%AF%BE%E6%80%A7%E7%90%86%E8%AB%96
text = """\
# 相対性理論
相対性理論(そうたいせいりろん、(独: Relativitätstheorie、英: Theory of relativity)あるいは相対論(そうたいろん)は、
時間や空間(時空間)と慣性力に基づく考察から、時空間の観測や重力を体系的に論じた物理理論。量子化を前提としない物理史上の古典
理論ではあるものの、物理学における他の力を含めた基礎的な事柄にも整合し、量子力学とともに現代物理学の基礎を成す理論体系である。
特殊相対性理論と一般相対性理論とに分けて理解されることが多いが、その名の通り特殊相対性理論(原則として慣性系のみを扱う)は一般
相対性理論(慣性系を含む座標系一般を扱う)の一部として包含されており「相対性理論」という術語は一般相対性理論と特殊相対性理論を
総称したもの。特殊論・一般論の双方ともアルベルト・アインシュタインにより発表され、世に広まった。
## 概要
相対的に等速直線運動する2つの観測者(慣性系である座標系)の間において、物理法則は互いに不変とする相対性原理と光速度が観測者の
速度の影響を受けず一定であるという2つの仮説・原理をもとに、絶対静止系のような定常的な計量に触れずに根本的物理法則を説明する
試みがあり、1905年に論文発表された。今日「特殊相対性理論」と呼ばれているこの理論では、特に、光速に準じた高速移動をする観測者
間の時間と空間の関係に対して、従来のニュートン力学よりも正確な理解が著され、ニュートン力学に見られた実験事実との齟齬を発展的に
克服した。また、特殊相対性理論は、電磁気学における座標変換(ローレンツ変換)に関する理解を前進させ、電磁気学の理論体系をより
発展させた。
特殊相対性理論に続いて、1915 - 1916年に一般相対性理論が発表された。一般相対性理論では、等価原理すなわち「速度の変動によって
生じる重力と質量のもたらす重力とは区別がない」という仮説・原理から、非慣性系を含めたあらゆる座標系における力学現象の理解を進めた。
具体的には、重力を座標系の計量として理解することで、特に、宇宙や巨大天体の構造と力学的挙動についての新たな理解をもたらした。
重力以外の他の力(電磁気力、強い相互作用、弱い相互作用)は、相対性理論の体系に付加的・補足的に組み込むことは可能であるが、相対性
理論の根本的量子化を含めて、これら他の力との統合的・統一的理解は、なお現代物理学の課題となっている。
## 歴史
1905年、アルベルト・アインシュタインにより一つの論文(アインシュタインの原論文の一つ)が発表された。1906年の発表において、
マックス・プランクは相対論(ドイツ語: Relativtheorie)という表現を用い、 このセッションにおける議論の中でアルフレート・
ブヘラ(ドイツ語版)が初めて相対性理論(ドイツ語: Relativitätstheorie)という表現を用いた。
特殊相対性理論の発表後、アインシュタインは対象を慣性系に限らずに適用できる理論の構築に取り組み、重力場について考察した一般
相対性理論へと発展させた。1916年の論文で、重力場の基礎方程式であるアインシュタイン方程式の最初の定式化がなされた。1917年の
アインシュタインの論文では、定常宇宙の前提のもとで宇宙定数が追加された。後にエドウィン・ハッブルらの観測により宇宙が膨張して
いることが明らかとなり、これに関わる宇宙定数の議論・理解も進められた。"""
scores = classifier.get_scores(text)
print(scores)
{'wiki_score': 0.9999701976776123, 'llm_score': 2.0635196082293987}
text = """\
メロスは激怒した。必ず、かの邪智暴虐の王を除かなければならぬと決意した。メロスには政治がわからぬ。メロスは、村の牧人である。
笛を吹き、羊と遊んで暮して来た。けれども邪悪に対しては、人一倍に敏感であった。きょう未明メロスは村を出発し、野を越え山越え、
十里はなれた此のシラクスの市にやって来た。メロスには父も、母も無い。女房も無い。十六の、内気な妹と二人暮しだ。この妹は、村
の或る律気な一牧人を、近々、花婿として迎える事になっていた。結婚式も間近かなのである。メロスは、それゆえ、花嫁の衣裳やら祝宴
の御馳走やらを買いに、はるばる市にやって来たのだ。先ず、その品々を買い集め、それから都の大路をぶらぶら歩いた。メロスには竹馬
の友があった。セリヌンティウスである。今は此のシラクスの市で、石工をしている。その友を、これから訪ねてみるつもりなのだ。
久しく逢わなかったのだから、訪ねて行くのが楽しみである。歩いているうちにメロスは、まちの様子を怪しく思った。ひっそりしている。
もう既に日も落ちて、まちの暗いのは当りまえだが、けれども、なんだか、夜のせいばかりでは無く、市全体が、やけに寂しい。のんきな
メロスも、だんだん不安になって来た。路で逢った若い衆をつかまえて、何かあったのか、二年まえに此の市に来たときは、夜でも皆が歌
をうたって、まちは賑やかであった筈だが、と質問した。若い衆は、首を振って答えなかった。しばらく歩いて老爺ろうやに逢い、こんど
はもっと、語勢を強くして質問した。老爺は答えなかった。メロスは両手で老爺のからだをゆすぶって質問を重ねた。老爺は、あたりを
はばかる低声で、わずか答えた。
「王様は、人を殺します。」
「なぜ殺すのだ。」
「悪心を抱いている、というのですが、誰もそんな、悪心を持っては居りませぬ。」
「たくさんの人を殺したのか。」
「はい、はじめは王様の妹婿さまを。それから、御自身のお世嗣を。それから、妹さまを。それから、妹さまの御子さまを。それから、
皇后さまを。それから、賢臣のアレキス様を。」
「おどろいた。国王は乱心か。」
「いいえ、乱心ではございませぬ。人を、信ずる事が出来ぬ、というのです。このごろは、臣下の心をも、お疑いになり、少しく派手な
暮しをしている者には、人質ひとりずつ差し出すことを命じて居ります。御命令を拒めば十字架にかけられて、殺されます。きょうは、
六人殺されました。」
聞いて、メロスは激怒した。「呆れた王だ。生かして置けぬ。」
メロスは、単純な男であった。買い物を、背負ったままで、のそのそ王城にはいって行った。たちまち彼は、巡邏の警吏に捕縛された。
調べられて、メロスの懐中からは短剣が出て来たので、騒ぎが大きくなってしまった。メロスは、王の前に引き出された。
「この短刀で何をするつもりであったか。言え!」暴君ディオニスは静かに、けれども威厳を以て問いつめた。その王の顔は蒼白で、眉間
の皺は、刻み込まれたように深かった。
「市を暴君の手から救うのだ。」とメロスは悪びれずに答えた。
「おまえがか?」王は、憫笑した。「仕方の無いやつじゃ。おまえには、わしの孤独がわからぬ。」
「言うな!」とメロスは、いきり立って反駁した。「人の心を疑うのは、最も恥ずべき悪徳だ。王は、民の忠誠をさえ疑って居られる。」
「疑うのが、正当の心構えなのだと、わしに教えてくれたのは、おまえたちだ。人の心は、あてにならない。人間は、もともと私慾のかたまり
さ。信じては、ならぬ。」暴君は落着いて呟き、ほっと溜息ためいきをついた。「わしだって、平和を望んでいるのだが。」
「なんの為の平和だ。自分の地位を守る為か。」こんどはメロスが嘲笑した。「罪の無い人を殺して、何が平和だ。」
「だまれ、下賤の者。」王は、さっと顔を挙げて報いた。「口では、どんな清らかな事でも言える。わしには、人の腹綿の奥底が見え透いて
ならぬ。おまえだって、いまに、磔になってから、泣いて詫びたって聞かぬぞ。」
"""
scores = classifier.get_scores(text)
print(scores)
{'wiki_score': 0.0027070045471191406, 'llm_score': 1.1400749031454325}
自分の昔の個人ブログでなるべく学術的でない文章を寄せ集めてみた。
text = """\
# 買ってよかったもの
## AfterShokz Aeropex 骨伝導ワイヤレスヘッドホン
リモートでミーティングが行われることも多いですよね。でヘッドフォンをいろいろ試してみたんですが、
インナータイプは、ずっとつけてると耳が痛くなるし、外の音が聞こえない。宅配便が来たりしても気づかな
かったり。
オーバーイヤータイプは、ずっとつけてると汗が気になる。
あと、AirPodみたいな完全ワイヤレスは、片方どっかに無くしそう。
ということで、耳掛けタイプ・ワイヤレス・骨伝導のこれにしました。Twitterあたりでも評判も良かったし。
長くかけてても耳も痛くならないし、外の音も聞こえるので、とても満足しています。ただ電車の中とかで使う
には、外の音にかき消されがちだし、音漏れもするので、ちょっと厳しいかも。音質も音楽を聞くという意味
では物足りないでしょうね。まあ用途が違うということで。
あとは、これでAlexa/Googleアシスタント対応だとホント神なんだけどなー。
## アルインコ コンフォートバイクII AFB4309GX
普段もそんなに運動しないのですが、リモートワークになるだけでこんなに動くことがなくなるとは思ってません
でした。うちの場合は、家・コンビニ・スーパーにいくぐらい歯科外に出ないし、100m圏内で全てが事足りて
しまうので、ほんとうに動かない。そんな生活が続いて、ちょっとお腹が出てきた運動不足が気になりだしたので、
思い切って買ってみました。
組み立てはちょっと大変です。あと結構場所取りますが、うちは敢えてリビングの端に鎮座しています。近いところ
におかないと続けられない気がしたので。
## ユニクロ ハイブリッドダウンパーカ
ダウンは着ぶくれする感じがあまり好きではなくて、数年前に買ったウルトラライトダウンを愛用してた(真冬は
重ね着で乗り切る!)のですが、流石に数年経つとヘタってしまい防寒の役目を全く果たさなくなったので、新しい
のを買いました。ウルトラライトダウンより全然温かいし、スッキリ見えるのが気に入ってます。バリバリのダウン
に比べれば防寒力は下がるんでしょうけど、これだけ外に出ることが少ない今なら十分ですね。今ならセールで結構
値段も下がってます。
"""
scores = classifier.get_scores(text)
print(scores)
{'wiki_score': -7.152557373046875e-06, 'llm_score': 0.2899294505768921}
だいぶ低い数字出せたな。
論文のプレプリントに、Swallowコーパスv2全体で適用した場合のスコア分布がある。
referred from https://huggingface.co/tokyotech-llm/edu-classifier/resolve/main/swallow-corpus-v2.pdf
LLM-based classifierで2以上を出せるような文章は結構少ないみたいで、1.5ぐらいが境目としては良さそう。
読み込んでしまえば、CPUだけでも推論かなり速くてびっくり。