見出し画像

【ふぇろっそ】連合学習とデータの偏り

こんにちは。Rosso AI部、連合学習担当の中の人です。
連載も第4回となりますが、こんなマニアック(?)な連合学習の記事なんて誰が読むのだろう?と思わないこともなく、、。←書いてて自分でそれを言うか!?
ぶっちゃけ「連合学習でLLMを学習させてみた」とか「絵を描かせてみた」という記事であればもう少し読む人も増えるのかもしれませんが、そのような記事を書く前に書いておくべきことあるだろ!というやや地味目な記事にあと少しだけお付き合いいただけたらと思います。

さて今日も、弊社の連合学習フレームワーク『FroseAi』を使用していろいろ試してみようかと思います。


連合学習がうまくいかなくなる条件とは?

さて、前回の記事で Resnet18モデルを使用した CIFAR10 の分類問題の結果を紹介しましたが、結果としてはあまりうまく行ってないように見えたかもしれません。

そこで今回は、もうちょい良い結果にしてみよう!ということで、先週のパラメータを少しだけ変えてみようと思います!

前回の答え

前回の記事で、こんな問題を出していました。

実はこの設定、連合学習のキツキツの設定だったりします。上の config ファイルをある部分を1行変えると、劇的に結果が変わります!
さて、それはどこでしょう???

前回の記事より

というわけで、早速答えです!(引っ張らないのか!??)

data:
  dataset: "CIFAR10"
  data_cache_dir: "./data"
  partition_method: "hetero"
  partition_alpha: 1.0

実はここの、 partition_method を変更する、もしくは partition_alpha の値を大きくすると、結果ががらりと変わります。

こんな具合に。

partition_method / partition_alpha を変更した結果

homo と書かれた結果(灰色)が一番良く、次に hetero=5.0 と書かれた結果(橙色)が良くなってますね。
実はこれが連合学習の難しさの一つである、データ偏りの問題だったりします。

連合学習を阻害するデータ偏りの話

さて、この partition_method と partition_alpha とはいったい何なのか?
実は(?)これらの変数は、データ偏りを設定するパラメータです。

  • partition_method: データの偏らせ方を決定する

  • partition_alpha: データの偏らせる量を決定する

FroseAi のこの辺りの処理は、FedML の処理を参考にして書いているわけですが、この2つのパラメータを使用することで、CIFAR10 のデータセットに対して、偏りを統計的に作り出すことができるわけです。

partition_method

現在、FroseAi では partion_method として、heterohomo を設定できます。

  • hetero: クライアント毎にデータ量、ラベル単位でデータを偏らせる

  • homo: クライアント毎に平均的にデータを分割する(偏らせない)

homo にするとデータ量、ラベル共に偏らせず、クライアント毎均等にデータを分割します。
例えば CIFAR10 の学習用データは 50000個ありますが、それを4クライアントで分割すると下記のようになります。
※FroseAi では各クライアントで何個のデータを保持しているか、ログで出力されるようになっています。

[FedDatasets] INFO :  partition data homo CL=0: datasize= 12500 / 50000
[FedDatasets] INFO :  partition data homo CL=1: datasize= 12500 / 50000
[FedDatasets] INFO :  partition data homo CL=2: datasize= 12500 / 50000
[FedDatasets] INFO :  partition data homo CL=3: datasize= 12500 / 50000

homo では綺麗にデータ数が4分割されていることがわかりますね。このような状況下では、上の結果の通り、連合学習も収束が進みやすくなります。

hetero の場合、以下に説明する partition_alpha の値により、偏り量を決定し、クライアント毎にデータを分割します。

partition_alpha

partition_alpha は値が小さいほど、偏りが大きくなります。

partition_alpha = 1.0 の場合:

[FedDatasets] INFO :  partition data hetero alpha= 1.0  CL=0: datasize= 12607 / 50000
[FedDatasets] INFO :  partition data hetero alpha= 1.0  CL=1: datasize= 13009 / 50000
[FedDatasets] INFO :  partition data hetero alpha= 1.0  CL=2: datasize= 11830 / 50000
[FedDatasets] INFO :  partition data hetero alpha= 1.0  CL=3: datasize= 12554 / 50000

partition_alpha = 5.0 の場合:

[FedDatasets] INFO :  partition data hetero alpha= 5.0  CL=0: datasize= 14296 / 50000
[FedDatasets] INFO :  partition data hetero alpha= 5.0  CL=1: datasize= 12999 / 50000
[FedDatasets] INFO :  partition data hetero alpha= 5.0  CL=2: datasize= 9790 / 50000
[FedDatasets] INFO :  partition data hetero alpha= 5.0  CL=3: datasize= 12915 / 50000

・・・と、データ数だけ見るとその差はわかりにくいのですが、正解ラベルも同様に偏りを作っているため、結果として partition_alpha が 5.0 より 1.0 の方が偏りが大きくなり、精度も partition_alpha = 5.0 の方が高くなります。

データ偏りはない方が学習が進みやすく、偏りが大きくなると学習が進みにくくなります。この辺りの詳細は次回以降でまたどこかで書くことにしましょう。

連合学習の実際

CIFAR10 は10クラスの画像を分類する画像認識タスクです。故に正解データが明確に10クラスで分かれており、上述の通り、partition_method や partition_alpha で偏り量を決めてシミュレーションすることができます。
ですが、LLMのファインチューニングといった自然言語処理タスクではどうデータを分割してシミュレーションするべきでしょうか。・・・うん私もわからん。(?)

実際、現在オープンソースで公開されている連合学習フレームワークの多くはシミュレーターの域を出てないものが多数あります。実運用で試そうとなると思わぬ落とし穴にはまりそうなものが多いのが現状です。

見方を変えると、連合学習はいう技術はまだまだ未熟で、十分に普及していない研究分野であるということかもしれません。

本ブログ連載では、そんな未知なる連合学習の魅力を少しでもお伝えできればという想いで連載しております。「連合学習って実際どうなの?」といった具合に気になる箇所がありましたら、ぜひこちらのコメント欄で共有していただきたいです。


最後に、株式会社Rosso AI部では、連合学習の相談も承っております。
こちらから、ご一報いただけると幸いです。