QEUR23_LLMDSS10: 閑話休題~databricks(15k)のデータセットの改造と分割
~ データ?small is best? ~
QEU:FOUNDER : “最近、ブログのリリース速度が落ちてきているなあ・・・。しようがない、LLM(大規模言語モデル)の宿命だが・・・。”
(QEUプロジェクトの3件とは?)
(1)世界の中心にある日本語: 常体文と敬体文の情報を学習に使って、日本語のトークンをきめ細かくコントロールする
(2)世界平和のためのLLM: 歴史の見方を(立場によって)多面化させる
(3)「user-llm」をシステムとした、feedbackシステムの構築
D先生 : “プロジェクトがさらに複雑になっていますからね。今回も、前回につづいて「猫(の飼い方)データセット」の解説ですか?”
QEU:FOUNDER : “まあ、今回の件は「Huggingface」にデータセットをアップロードしました。・・・結局、言いたいことはこれだけなんだけどね(笑)。「facebookページを立ち上げました!」みたいで恐縮です。”
D先生 : “あれ?例のdatabricks(15k、日本語版)についてもアップしたんですか?”
QEU:FOUNDER : “ただし、内容がかなり変わっています。”
D先生 : “もともと、このデータセットって15kのサイズでしたよね。なんで、内容を追加して16kにしたんですか?さらに、それを4分割にして・・・。”
QEU:FOUNDER : “LLMについては、時間と共に知見が追加されていろいろな思いが交錯するが・・・。我々のfinetuning(FT)の第一歩としては、学習データを大きくしたくないんですよ。Jeremy Howard(JH)の話「↑」を見ても、「学習データを工夫するとFT学習が速くなる」ことがありそうだともいうし・・・。”
C部長 : “学習データのサイズを小さくすると、学習が速くなる。そんなもん当たり前じゃないですか?”
QEU:FOUNDER : “「学習データが少ないとFT処理が速い」ことは当たり前ですよね。さて・・・、ちょっと小生の話を聞いてください。JHは、とあるkaggleのコンペでLLMを学習したらこんな曲線を得て、びっくりしたらしいです。1エポック(学習データを一通り処理した)ごとに、学習損失が一気に下がったらしい。”
D先生 : “こんな曲線は見たことがないですね。”
QEU:FOUNDER : “さらに、少し条件を変えると、さらに変な学習曲線に遭遇したらしいです。その現象について、JHは自分の見解をコメントしています。”
But during this time, validation loss suffers. That’s because although the model is getting very confident, it’s not actually getting any better at making predictions. It has simply memorized the dataset, but isn’t improving at generalizing. Over-confident predictions cause validation loss to get worse because the loss function penalizes more confident errors higher.
ただし、この間、検証損失が発生します。 なぜなら、モデルは非常に自信を持っていますが、実際には予測がさらに良くなっているわけではないからです。 データセットを記憶しただけで、一般化が進んでいません。 損失関数は信頼性の高いエラーに対してより高いペナルティを与えるため、自信過剰な予測は検証損失を悪化させます。
There is no fundamental law that says that neural networks can’t learn to recognize inputs from a single example. It’s just what researchers and practitioners have generally found to be the case in practice. It takes a lot of examples because the loss surfaces that we’re trying to navigate using stochastic gradient descent (SGD) are too bumpy to be able to jump far at once. We do know, however, that some things can make loss surfaces smoother, such as using residual connections, as shown in the classic Visualizing the Loss Landscape of Neural Nets paper (Li et al, 2018).
ニューラル・ネットワークが 1 つの例から入力を認識することを学習できないという基本的な法則はありません。 これは、研究者や実務者が実際に当てはまると一般的に発見していることです。 確率的勾配降下法 (SGD) を使用してナビゲートしようとしている損失曲面は、一度に遠くまでジャンプするには凹凸が多すぎるため、多くの例が必要になります。 ただし、古典的な論文「Visualizing the Loss Landscape of Neural Nets」(Li et al、2018) に示されているように、残留接続の使用など、いくつかの方法で損失曲面を滑らかにできることはわかっています。
D先生 : “データが少なくなると高速で「記憶すること」という点では歓迎するべきだが、その一方で損失関数がガタガタになり「認識すること」の機能が壊れてきます。う・・・ん、どうすればいいんでしょうか・・・。“
QEU:FOUNDER : “いましがた、D先生が言ったところの「認識」って、JHは論文では「一般化」と言っていました。CNNによる画像認識の場合には、「一般化」の概念は可視化されてわかりやすいです。昔、こんな図(↑)を見たことがあるでしょ?動物と同じように、学習に伴い「頭脳」のどの部分で何を認識するかが明確になってくるんです。ただし、LLMの場合にはかなり本質的な部分が変わってきますがね。”
C部長 : “本質的な部分?”
QEU:FOUNDER : “LLMはトンでもなく規模が大きいということ。当たり前だが・・・。例えば、pre-trainのLLMがあるとします。まずはAというデータセットを学習し、そのあとでBというデータセットを学習しました。こんなやり方は、従来のディープラーニングでは「破壊的学習」となり禁じ手なんです。でも、LLMでは?”
D先生 : “FOUNDERの言い方によると、「あり」なんですかね?”
QEU:FOUNDER : “現時点では「(破壊的学習は)あり」なんじゃないかと思っています。データセットBを学習するとAで学習した記憶は破壊されるでしょう。でも、「一般化(認識)」は残っている可能性がありますよね。”
D先生 : “なるほどね。AとBのデータセットの役割を分割させようというわけ。”
QEU:FOUNDER : “そんな考え方で、「小さめの」データセットを種々準備しているわけです。あとで組み合わせて使うと・・・。ついでに、プログラムを載せておきましょうか。データ変換のための、つまらんものですが・・・。”
###################
# 収縮版JSONファイル(jsonl)を作成する
import json
import pandas as pd
import numpy as np
with open('databricks-dolly-15k-review-2_of_3-ja.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# ----
arr_index = []
arr_instruction = []
arr_input = []
arr_output = []
arr_category = []
# ----
#for i in range(4000): ### len(data)
for i in range(4000,8000): ### len(data)
arr_index.append(data[i]['index'])
#print(i, data[i]['index'])
arr_instruction.append(data[i]['instruction'])
arr_input.append(data[i]['input'])
arr_output.append(data[i]['output'])
arr_category.append(data[i]['category'])
# ----
# データフレームを作成する
mx_df = np.array([arr_instruction]).T
df = pd.DataFrame(mx_df, columns=["instruction"])
#print(df)
# ----
# 項目の追加
df['input'] = arr_input
df['output'] = arr_output
print(df[0:10])
# ----
# JSONLファイルに変換して出力する
with open('databricks-dolly-16k-line_ja-2_of_4.jsonl', 'w', encoding="utf-8") as f:
for row in df.to_dict(orient='records'):
f.write(json.dumps(row, ensure_ascii=False) + '\n')
QEU:FOUNDER : “こんなJSONLファイルができるわけです。”
QEU:FOUNDER : “次回もデータセットの話をしましょう。”
~ まとめ ~
D先生 : “相変わらず、この件(↓)で世の中が盛り上がっていますが・・・。”
QEU:FOUNDER : “相変わらずにぎやかなこと・・・。”
D先生 : “こんなこと(↓)もあります。“
QEU:FOUNDER : “相変わらずにぎやかなコト・・・。”
D先生 : “こんな、「オマケ」もあります“
QEU:FOUNDER : “結局、過去30年間に起こったことが、「何がどうだったのか」がおぼろげながらわかってきましたね。”
おっさん(@QCサークル講話);「従業員の皆さんにはテレビを見てください。皆が同じように考えてください。」
オッサン(@車中、N社検査不正について): 「“検査不正”っていうのはなァ、(組織外に不正を)漏らしたヤツが悪いんだよ・・・」
オッサン(海外工場のあいさつにて):「私の使命はこの会社で終身雇用制を実現することにある・・・。」
D先生 : “あれ?急に、おっさん推しですか・・・?”
QEU:FOUNDER : “小生も、清潔をこころがけておる・・・。”
コメント
コメントを投稿