A-B、A-C、A-D…な会話プロンプトをローテーションさせることのメリットは他にもある。KVキャッシュのsave & loadが効く。ここにB-Cなどのプロンプトまで含めると、保持しておくべきKVキャッシュの数が増えて非効率だからね。

スレッドを表示

speaker1はA固定で、speaker2にB,C,D…がターン毎に差し替わる。

まあ、そういう作りになってないのは確かなので、大改造は必要だけど、根本的な会話モデルに手を入れなくて済む。

スレッドを表示

この仕組みだと、会話参加人数を何人でも増やせるはず。

スレッドを表示

A-B、A-Cの会話を交互に(あるいはLLMによる選択に従って)実行し、チャットログを共有する、というのが良さそう。

A→B→Cという順で発話をさせたい場合、A-B→A-Cの順で会話を実行するが、2つ目の会話ではAの発言をスキップする、という風にすれば良いだろう。(発言スキップはできるようになってる)

また、BからCに話すときは、A-Bの会話中で、「BがA以外の相手に話しかける」イベントとして組み込めば良いな。あくまでチャットの中心はAなので、A以外に話すのはどちらかというと従の行為だから、こういう扱いで良さそう。

スレッドを表示

でも、会話は「自分」と「相手」の2人で行うものである、というモデル化は悪くないと思ってる。

LLMで実装する場合、会話参加人数分、個別の「主人公が相手と話す、という1人称小説を書いて下さい」というプロンプトを推論することで、登場キャラたちの人格が混ざりにくくなる効果があるので。

だからまあ、うまいこと、このモデルを多人数会話に拡張したいなあ。精度と効率を保ちつつ。

スレッドを表示

そもそも、chatはspeaker1(ユーザーとか主人公とかのrole)とspeaker2(speaker1の会話相手としてのrole)の会話で構成されていて、両者は等価な扱いをしてないんよね。
なので、A-B、A-Cは良いとして、B-Cの組み合わせってのがそもそもできない。BとCを等価に扱う仕組みになってないので。

スレッドを表示

キャラチャット、会話の最小単位は1対1で行われるものだ、という前提で作ってて、複数話者が参加する会話を実装する際には、1対1の会話の集合として定義するつもりだった。

しかし、例えば3人の話者ABC(Aは人間ユーザーでも良い)が参加するだけでも、A-B、B-C、C-Aの3つの組み合わせを要することになってめんどいな。

つまり、設計が良くなかったかもしれない。

YouTuberの製品レビュー案件、絶対に忖度が入るので、消費者的には良いことは何もないなあ、と思っていたが、意外とそうでもないという気がしてきた。

当該の案件動画は確かに直接は参考にはならないんだけど、「有名YouTuberがレビュー案件を受けがちなあの製品を、敢えて自腹購入して本音レビューする」というのがYouTuberのコンテンツとして成立し、そっちはかなり参考になる。(ステマは無いという前提は必要)

あと、あまり案件動画にならない、競合製品の方も取り上げられやすくなる効果がある。

n=5^(9^42)の精度の求め方。
ln((1+1/x)^x)をテイラー展開すると、
(1+1/x)^x≒e(1-1/2x)
という近似式が得られるので、これを利用する。
e*(-1/2x)にx=5^(9^42)を代入して得られるとても小さな数が誤差になるので、このlogを取れば誤差の桁数が分かるという寸法だ。
で、それが8368 澗桁だかになるみたい。

スレッドを表示

x.com/Science_Release/status/1
これよく見つけたな、と感心してたが、
e = lim n→∞ (1+1/n)^n
というネイピア数の定義に対して、1~9の数字を1つずつ使って、一番大きくなるnを2つ作ったということなのね。

e≒(1+0.2^(9^7*6))^(5^(3^84))の場合、
n=(1/0.2)^(9^7*6)=5^(9^42)
n=5^(3^84)=5^(9^42)
となる。

Linear Attentionでの学習は、通常のAttention(softmax関数利用)に比べると収束速度は緩やかだけど、その分O(n)の圧倒的速度でsteps数を稼いでカバーできるから問題ない、みたいな感じか。

スレッドを表示

qiita.com/Yosemat1/items/802a4
ふむふむ。O(n^2)をO(n)の計算で近似するというんじゃないんだな。O(n^2)な類似度算出計算を、O(n)な計算に分解する「逆カーネルトリック」なる手法を使うらしい。

ただし、Attention機構で使われるsoftmax関数を分解すると、無限大に発散する関数になってしまい適用できない。だったら逆に、分解先の関数をまず決めて、カーネルトリックにより導出される関数をsoftmax関数の代わりに使えばいいじゃない、という発想のようだ。

人類はほんといろんなことを考えるな。

スレッドを表示

ともかく、SanaはDiTとしての構造がシンプルだし、シンプルなものはだいたい強い法則がある[要出典]ので、きっと高性能なんだろうなあ。(FluxやSD3は複雑すぎてよくわかんないけど、複雑なのは確かだ)

Linear Attentionがどんなものか、まだよく調べてないけど、O(n^2)をO(n)にするには、何らかの近似が行われているはずで、そのことによる性能劣化がどの程度あるかによるな。

スレッドを表示

いや、Latent Diffusion ModelのようなU-Net構造を取らず、latentとconditionを入力してなんらかのAttention処理して、noiseを出力するブロックを直列に繋いだものなら、DiTの定義を満たすのかなぁ。

スレッドを表示

で、個人的にはDiTって何なのか分からなくなってきた。潜在表現をシーケンス化し、プロンプトや時刻情報など条件をそこに追記し、Self AttentionすることがDiTなのかと思ってたが、どうもそうじゃないらしい。

U-Netを使わなければDiT、というわけでもないらしい。
条件のKVとCross AttentionしなければDiT、というわけでもない。(そもそもDiTの論文には、DiT Block with Cross Attentionというのがあって、Sanaもこれに近いように思う)

結局、まだ理解が足りてない。もっとがんばりましょう。

スレッドを表示

nvlabs.github.io/Sana/
Sana、DiTでTransformerにLinear Attention機構を採用することで、計算量O(n^2)をO(n)に落とし込んだこと、VAEの代わりにDeep compression autoencoderという高圧縮率な変換をかけていること、テキストエンコーダーの前段にLLMによるユーザープロンプト強化を行っていることが新しいみたい。構造としてはシンプルに見える。

このスレッドだとChatGPTと同じ解答があった。安心した(?)
stackoverflow.com/questions/18

しかしExcelの列名は結構面白いネタだな。そもそもこれ、bijective numerationという記法で、n進法とは全く違うものらしい。
en.wikipedia.org/wiki/Bijectiv
qiita.com/hibit/items/608b3ffe

スレッドを表示

ChatGPTに聞いたら、もっとエレガントな解法を出してきた…。
前回の商を1引いてから割り算するだけ。
結果は0baseなので1baseにシフトすれば良い。
いや、確かにそれでいいよな。

今までChatGPTバカにしててごめんなさい。もう人間はおしまいです。

スレッドを表示

ちなみに、日本語でググったら、間違ったコードが出てきたw

スレッドを表示

分からんからカンニングした。
要は、10進→26進変換の計算をするとき、26で割った余りが0のときは、商から1引いて、余りを26に変換する。これだけで良かった。言われてみれば。

惜しいところまでは行ってたのだが、沼にはまってしまった。精進が足りませんね。

スレッドを表示
古いものを表示
Fedibird

様々な目的に使える、日本の汎用マストドンサーバーです。安定した利用環境と、多数の独自機能を提供しています。