RWKVを公開データ+社内データでファインチューニングしてみた

ファインディ株式会社で機械学習エンジニアをしています、笹野です。
ChatGPT発表以降LLMに注目が集まり、手元のマシンでも動くようなLLMも数多く登場し、これらに関する記事も散見されるようになってきています。

情報を仕入れる目的で様々な記事や文献に目を通しますが、オープンデータでのファインチューニング記事は多数公開されています。一方で、元々社内・組織内に蓄積されたデータを使ってファインチューニングされたモデルの精度に言及する記事は、観測している範囲では見つけられていません。
長々と前置きをしてしまいましたが、今回は社内のデータを集めてRWKVにファインチューニングさせた場合に、モデルの出力がどのように変化するのかを共有しようと思い、記事を書いてみました。
LLM内製化の取り組みの一環でもありますので、読んで頂ければと思います。

RWKVとは

これまで公開されてきたGPTを初めとするLLMは、Transformerをベースにしたものがほとんどでした。精度としてもこのTransformerベースのモデルが上位を占めていましたが、100%RNNベースのモデル(非Transformerベース)でありながら、同程度のパラメータ数を持つTransformerベースのモデルとの比較であれば同等の精度を出すことができるようになりました。また、推論時間の高速化やモデル学習時の効率化を達成する事ができる新しいアーキテクチャとして、RWKV(Receptance Weighted Key Value)が公開されました。

hugging faceのmodelsからモデルをダウンロードする事ができ、日々様々なタイプの事前学習済みモデルが公開されています。

また、RWKVについて詳細な解説をしている記事も多数ありますので、興味がある方は是非読んでみてください。
個人的に、勉強になった記事を代表して貼らせて頂きます。

ファインチューニング

今回は、このRWKVをファインチューニングさせてみました。
ただその辺のデータセットでファインチューニングさせるだけでは面白くないので、自社で溜め込んでいるデータの一部を公開されているデータセットに混ぜ込んで学習させてみるとどうなるのか?を試してみました。

モデルについて

今回は、rwkv-4-pile-7bをベースモデルとしました。

学習データについて

今回はこちらの日本語訳データセットをベースにさせて頂きました。

RWKVに学習させる際にこのまま使うのは難しいので、instruction + input + outputで繋ぎ、1レコード1センテンスという形に変換しています。
これに、自社データの一部(約3000件)を加えて学習データセットとしました。具体的な内容は出すことはできないのですが、データの雰囲気を共有したいと思います。

株式会社hogehoge
求人タイトル:ビジネスデータアナリスト募集

<業務内容>
・ビジネスデータの収集、分析、レポート作成
・データベースクエリの作成と実行
・売上データや市場トレンドの分析

<必須スキル>
・ビジネスデータの分析経験がある方
・ExcelやSQLなどのデータ処理ツールの使用経験がある方
・数字や統計データに敏感な方

言語: SQL, Python, R

所謂求人票形式のテキストデータです。

ファインチューニングの環境について

今回のファインチューニングはVertex AIのA100 80G×2が刺さったインスタンス上で実行しました。
こうしたインスタンスを使わせてくれる社の環境に感謝したいです。

ファインチューニングについて

ファインチューニングの際のコードは、こちらのレポジトリを参考にさせて頂きました。

LoRAを組み込んだファインチューニングを行う事ができるので、学習時間をグッと抑えることができました。

結果

今回は4000epoch程度回したので、その結果どうなったかを紹介します。

rwkv-4-pile-7bのinputにするテキスト

ファインチューニング後のモデル精度を確認する為にinputするテキストを2パターン用意して、それらのoutputを確認していきます。

  • +qa FBIとCIAの違いは何ですか?

  • +gen 使用言語:python,

RWKVではinputテキストの先頭に「+qa」とつけるとその後に続く文章に対する回答を得る事ができ、「+gen」とつけるとその後に続く文章の続きを生成させる事ができます。

+qa FBIとCIAの違いは何ですか?

まず、FBIとCIAの違いから聞いてみたいと思います。ファインチューニング前の状態+1000epoch刻みでモデルに聞いてみます。
ちなみに筆者は違いを知らないので、簡単に調べてみました。

FBIはアメリカ司法省に属する捜査機関で、大きな事件などの捜査を行います。

CIAは人を使って対外諜報を行うアメリカの情報機関です。

"違いのギモン"より

なるほど、捜査機関か情報機関かという違いがあることがわかりました。
今回使わせて頂いた学習データの中に、FBIとCIAの違いに関するデータがありましたので、上記のように違いがわかるような回答を期待したいです。

ファインチューニング前

FBIは大きく存在することは知られていません。
現在大勢が考えるに、彼らは、データベース、ネットワーク、そして、電子メールなどの情報、そして大量の犯罪を管理します。
連邦政府によるファイアウォールはあなたが検閲をかけることはできません。
これは、人間では非常に困難です。

モデルはファインチューニング前にFBIとCIAの違いについて良く知らないということはわかりました。

1000epoch

私たちの方法は、国の法執行機関にとって非常に優れているためです。
私たちは適切に機能します。ただし、米国の公序良俗に関する民間法執行機関の能力を擁護しています。 
ほとんどの人が知っていると思う「知っている」ことはありません。どのように機能するのでしょうか。 
ある民間企業が米国の情報を盗むことができるように計画した場合、私たちはそれを知りません。
そして、民間企業は、法執行機関にそれをやり遂げることができません。 
それは、私たちがどこにいるかを知っていることに基づいて起こることがわかります。
ほとんどの人が知りません。とはいえ、私たちが知っていて、そのようなことをしている場合、
私たちはそれを知っています。 それは米国の法執行機関に起こることができることです。 
ほとんどの人が知っていることは、私たちが盗んだものを売りに出し、購入するために利用できないときです。
私たちが知っていることは、私たちが盗んだものを売りに出し、それを購入するために利用できないことです。 
それは私たちの方法です。私たちはそれが機能することを知っています。 ほとんどの人は知りません。
そしてそれは、私たちが非常に優れているために機能することがわかります。

FBIとCIAの違いでは明らかにないし、何についての回答か全くわからない…

2000epoch

それらはいくつかのギャップがあり、さまざまな質問をすることができません。 
多くの米国人はFBIを信頼しており、それはいくつかの理由があります。 
FBIの主要な活動は犯罪であり、そのようなものはCIAが確立された後も変わりませんでした。 
米国の公民権運動は、FBIを「まずはそれをやめよう」という要求をたびたび提起しました。 
それらはCIAが多くの重要なものを持っていたためです。 それらは多くの活動をしていたため、
それはCIAを「まずはそれをやめよう」という要求を得ました。米国の最高裁判所は、
1960年代にCIAの標的となったものの多くを防ごうとしました。
国家安全保障について、そしてそのリストの半分はCIAです。 
1960年代にCIAが行ったことはすべて非公開でした。 それらを指す暗号は「-CIA」のようなものでした。
最初のCIA暗号は1966年です。 それは財政的に不可能でした。
そのため、いくつかのための温室で作業を行うことなく、CIAはデジタルデータを保持しなければなりませんでした。
今日、CIAはそのようなことをしなければなりませんでしたが、それはそれらの情報を保護することです。
さらに、FBIはCIAの反対側でした。 FBIのそれ自体は、CIAと戦うことができませんでした。
そのため、FBIはCIAの一部に向かって戦いました。 それは国家安全保障の基礎として、CIAが危険になります。 
CIAはほとんどFBIに支払われていませんでした。 それはFBIにどのように取り組むことができるかです。

冒頭少しそれっぽさは感じたものの、その後正しいか正しくないかよくわからない(きっと正しくない)歴史をつらつらと語り始めた…

3000epoch

いくつかの点ではFBIとCIAは異なります。
FBIは、アメリカという国を維持することを目的としています。
CIAは、アメリカ国家安全保障に関する情報を収集し、保管するために活用するためのものです。
一部の人々はFBIを厳しい評価しますが、CIAを厳しい評価したい人はそれについて言うでしょう。
実際には、FBIはその名のように法執行機関ではなく、私たちが私たちがしたことを正確に記録し、
保存し、明確に表現することにより、それを公然と監視していると言えます。私たちが行っていることは、
まったく公然と監視されていません。それは私たちに閉じ込められています。私たちがやろうとしていることは、
あなたがCIAとFBIの違いを知りたいということです。

お?冒頭3行はいい線行っていそう。

FBIは、アメリカという国を維持することを目的としています。

FBIの存在意義を考えても大義としてきっと間違っていないだろうし

CIAは、アメリカ国家安全保障に関する情報を収集し、保管するために活用するためのものです。

CIAが情報機関であるという点を踏まえると、まぁそんなに間違ってはないのでは??

4000epoch

FBIは国家安全riminalistics局を持ち、CIAは中太地活動部署を持ちます。
まあ私たちはどちらよりも人間と人間の関係を進めているので、私たちは
すべての国でさらされることなく世界的に公民として働いています。 
私たちが持っていることはそれらより資金に困りません。

3000epoch目がそれなりだっただけに、内容的には少し残念。
回答として端的になったのは◎

+gen 使用言語:python,

次に、求人票の続きを生成させてみます。
同じ感じで、学習前の状態から1000epoch刻みで結果を見ていきます。

ファインチューニング前

ruby, ruby on rails, golang, scala, kotlin,
java, pptp, ngrok, git, ssh, msql, php, vue.js, python, 免費

採用者以共通的專屬需求為基礎,採用人員之間的沟通方式為:短文準備,檢討,形象化方案,工程計劃,
應用建設,促進工程、規劃工程、預算化方案、展示

+qaの時同様、ファインチューニング前ではそれっぽくない生成結果になってしまう。そして中国語…

1000epoch

javascript, ruby, go, caffe, caffe nodule
使用言語:golang, caffe nodule, keras, caffe image_resizer, caffe inception, caffe inception, caffe inception

また、以下のことを確認してください。 
予想されたプロトタイプではなく、実際の概念実証に焦点を当てており、フレームワークや資産に注意を向けていることを確認してください。 
さらに、そのことを覚えておくこと。それがすぐに非常に重要になる場合は、正確なプロトタイプとしてシステムにおいて実装できることを確認してください。
これは、チームで進行ができるかどうかを確認するために良い方法です。 (チームがたくさんいることに気づいたら、それを気にすることです) 
つまり、少なくとも最初に「プロトタイプ」という言葉を用いることができることが重要です。 そのためにも、フレームワークや資産について話すことを確認してください。
これには、フレームワークを含む実装方法を含む、システム全体の動作を記録する方法などのことです。これは、自分たちのシステムについて何を知っているのかということです。
それはあなたが同意することができるかどうかにかかっているので、それを決して見せないでください。それがおそらくあなたの自己表現であり、それはあなたが考えていることではありません。
そして、それはあなたのアプリケーションとシステムに対する考え方を示していることを示しています。 そのためにのみ使用する必要があることはよくありませんが、
それでもよいのであなたにそれを考えさせることができます。 私はそうすることを望んでいるので、私はそれをすることができます。そして、それはあなたが良いことだと思うことができます。

日本語であるという点以外で、ファインチューニング前とさほど変わらず。

2000epoch

javascript(react), golang, flask 
このポジションでは業務委託で未熟なデータに対する学習をサポートすることで、データサイエンスサービスの導入に向けて
成長を促進していくことに興味がある方がいらっしゃいましたら、応募お願いします。 
<求人概要>
現在データサイエンスサービスを提供し、予定しているデータサイエンスサービスの利用者を募集します。 
現在すでに利用されているシステムの予算はわずか1000万円と言うので、それを3000万円で超えるシステムを作りたいという
想いがあります。 このシステムを作り上げるために作ったコミュニティがたくさんいることを知り、そのコミュニティに深く溶け込みたいという思いをお持ちです。
そういった想いから、データサイエンスサービスを提供することで、お客様にまずは膨大なデータの処理に時間を費やしてもらうことができるようにしたいという想いがあります。
またこのご求めも否定的ではなく、未来のためにそこまでしたいという思いからです。 ただしそれ以外にも「学びたいこと」や「考えたいこと」を知り、
手始めにすることができる人材を探し続けることで、業務委託でのみ提供していただくような人材の採用はしない予定です。 
またコミュニティを運営するためには、本格的に始められたときには現在のものがどんどんどんどんと簡潔になってくることを考えております。
それに対してデータサイエンスサービスの現在のシステムは全く機能していないことがわかり、さらには時には少なくとも未熟である ...

少し求人票っぽい表現に変わっていそう。

3000epoch

ruby, golang, swift, javascript, coffeescript, scala, dart, racket, rust, elixir, dartlang

大まかな計画は次のようになります。 

- モデリング言語のソースコードを書き始めます。これらは機械に理解されずに書かれています。 

- 基本的な知識を得て、チャレンジします 

- モデルが十分に構築されたら、ほかの人がそれを利用できるようにし、可能性のあるエコシステムを作ります 

- 自分のソースコードの変更がシステムに適用されるようにするために、デプロイメントとモデリングの仕組みを学びます 

- 機械を利用可能にするために実行可能なデータセットを作成します。 

- 生成されたデータセットを使用して、モデルがどのように機能するかを評価することを学びます 

- モデルの再利用可能な部分を作成します 

- 利用可能な部分を作成します 

- コミュニティにデータセットとモデルを提供します。 

- コミュニティが使用可能になったら、データセットをライブラリとして提供します。 

- ソースコードとモデルを使ってさらに新しいものを作成します。 

- データセットとモデルはGitHub Pagesで公開されます。 

- モデルがどのように機能するかをテストするために使用できるように、モデルを[テストできる...

求人票の「求人概要」もしくは「業務内容」に相当するっぽい表現には変わっていそう。
求人票であるを前提とするともう少し抽象度の高い表現で端的に書いてほしい…

4000epoch

使用言語:python, java, dart, ruby, golang 仕様は非公開です。

下記スタートアップに最適です。 
・Web Server:gae, ruby on rails 
・Database:nosql mongodb 
・Web Server Debug:chrome dev tools 
・Cloud Storage:object storage buckets (rackspace australia) 
・Production Traffic Monitor:cloudflare prometheus

▼現在の仕事内容
・メモリ準備 
・ブラウザー連続終了 
・ブラウザー連続画面離ょ 
・WIFI接続時に落ちることとなった画面の再現を確認します

▼現在のプロジョン
・画面連続の確認を確認するためのメモリ準備 
・画面連続の確かめ対策の確かめ 
・Web Server Debug:ruby sinatra mongodb mongodb mongodb production traffic tester debug toolkit

内容は散々ではあるものの、一番求人票っぽい表現になった。

まとめ

公開されているデータセットに自社のデータを一部混ぜ込んでファインチューニングした場合に、RWKVのoutputがどのような結果になるかを確認してみました。
体感の精度としては、まだまだ詰めていく必要のある状態である事は結果を見るに明らかだと思います。
ただ、ファインチューニングの手軽さと、時間はかかるもののepoch数を回した場合にoutputの改善が見られている事を踏まえると、RWKVに希望を見いだせそうかも?とも思いました。

今回パラメータ調整、もっと違うデータセット・前処理を試してみる、異なるモデルサイズでのファインチューニングなどの検証はできていません。この辺りの試行錯誤を行なってみるとまた違った結果になると思いますので、引き続きRWKVを初めとするLLMモデルで検証を進めていきたいです。

最後に、弊社現在絶賛機械学習エンジニアを募集しています。
LLMの取り組みを初め、様々なタスクに取り組むことができる環境となっていますので、興味のある方のご応募お待ちしております!


この記事が気に入ったらサポートをしてみませんか?