Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

iki_tukr #19

Open
wants to merge 14 commits into
base: main
Choose a base branch
from
Open

iki_tukr #19

wants to merge 14 commits into from

Conversation

ryusei-iki
Copy link
Contributor

@ryusei-iki ryusei-iki commented May 19, 2022

minimum

  • 関係データについて理解し、関係データとは何か説明できる。
  • TUKRのタスク設定について理解し、数式やアルゴリズムの各ステップを説明できる。
  • data_scrach.pyの穴埋めを行い関係データの人工データを作成する。
  • UKRの実装ファイルを改良してTUKRを実装する。

standard

  • 欠損データを実装する
  • 手動微分で実装する。
  • 描画方法を変更する
  • クロステストの実装
  • 実データでの実装。(動物データやNIPSデータなど)

extra

  • 手動微分を数式的に導くことができる。

Comment on lines +7 to +9
import sys,os
moto=os.getcwd()[:-5]+'iki/'
sys.path.append(moto)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

このへんこまってるなら pathっていう3.8系くらいから追加された標準ライブラリ結構使えるかもです.

@TetraMiyazaki
Copy link
Contributor

TetraMiyazaki commented May 19, 2022

Pull Requestの名前も書えといてください
あと,Mission Success Criteriaも一番上に書いといてください.

@nahoando
Copy link
Contributor

ミニマム、スタンダード、エクストラの設定をまずしましょう。何か結果が出た場合や作業が滞った場合などは結果をシェアして先輩や同級生のアドバイスもらえる環境づくり心がけましょう。実際こちらもコード見ただけではわからないところも多いです。add, commit, pushを忘れずに!

@ryusei-iki ryusei-iki changed the title first_commit iki_tukr May 19, 2022
@ryusei-iki
Copy link
Contributor Author

ryusei-iki commented May 19, 2022

pull requestの名前の変更,設定完了しました!!!

@ryusei-iki
Copy link
Contributor Author

動かして描画するところまでは出来ましたが,上手く学習が行かなかったです.

Z1のカーネルとZ2のカーネルをかけるところが怪しいです.

学習時の描画

y_zn.mp4

ワイヤーフレームの描画

wire_zk.mp4

潜在空間Z1の描画

zn1.mp4

潜在空間Z2 の描画

zn2.mp4

すべての損失
loss

二乗誤差の損失
loss_mse

正則化項の損失
loss_L2

k2=kernel_f(target2,type,2)
# print(target1.shape)
# print(k1.shape,k2.shape)
k=jnp.einsum('ij,jk->ik',k1,k2)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

110と111行目を考え直してみてください.
まず,110行目でkを2階のテンソルに丸めていますが,この次の式でxijと掛けなきゃなのにこれだとij成分が消えちゃってますね〜

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これは,取り組み方ですが,数式にでてくる項を変数だとどのようなshapeになるか書きながらやってみるといいかもです.

@TetraMiyazaki
Copy link
Contributor

すべての損失 loss
二乗誤差の損失 loss_mse
正則化項の損失

このへんみてるのはナイスですね〜
書いてないけど,正則化項の微分しか効いてないって推測して写像の方に問題があるって思っているのは正しい.ですね.

@hirowatari-s
Copy link
Contributor

あと実装とは関係ないですが,Assignees(このプルリクの担当者)はイキくんですね!

Comment on lines 85 to 90
def fit(self,):
#テスト時に入力がznのときのyを求める関数
def kernel_f(target,type=1,jyun=-1):
if(type==1):
d = jnp.sum((target[:, None, :] - target[None, :, ]) ** 2, axis=2)
k = jnp.exp(-1 / (2 * self.sigma ** 2) * d)
Copy link
Contributor

@TetraMiyazaki TetraMiyazaki May 20, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

これ,self書くのがめんどくさいからこういう書き方してるんかな?(はじめてみた)
外部から参照が必要ない場合はこれでもいいかもね.(違和感すごいけど)

@ryusei-iki
Copy link
Contributor Author

レコード型のTUKRを取り組んでいます.

計算式は間違っていないと思う.
ワイヤーフレームは上手く行っていない.
潜在空間を二次元にしているが,一次元的な動きしかしていない.

ワイヤーフレームが上手く行っていない理由は,潜在空間上の点が線上になっているため,二次元のメッシュグリッドを潜在空間として与えても教師データにない点が多いためだと思う.

次は,潜在空間を1次元にして試してみる.

wire_zk.mp4
y_zn.mp4
zn1.mp4
zn2.mp4

@TetraMiyazaki
Copy link
Contributor

TetraMiyazaki commented May 26, 2022

計算式は間違っていないと思う.ワイヤーフレームは上手く行っていない.

学習ができているかの確認の段階はまずはデータの推定値$\hat{x}_n = f(z_n)$を描画してみるといいと思います.単純に与えられたデータに近くにきているかでまず判断しやすいので.

潜在空間を二次元にしているが,一次元的な動きしかしていない.

この潜在空間の話は直積潜在空間$\mathcal{U} \times \mathcal{V}$の空間の話でしょうか.それとも個別の潜在空間$\mathcal{U}$の話でしょうか

@ryusei-iki
Copy link
Contributor Author

計算式は間違っていないと思う.ワイヤーフレームは上手く行っていない.

学習ができているかの確認の段階はまずはデータの推定値$\hat{x}_n = f(z_n)$を描画してみるといいと思います.単純に与えられたデータに近くにきているかでまず判断しやすいので.

y_zn.mp4がデータの推定値とデータとの比較の動画だと思います.これを見る限り,学習は出来ている!?

潜在空間を二次元にしているが,一次元的な動きしかしていない.

この潜在空間の話は直積潜在空間$\mathcal{U} \times \mathcal{V}$の空間の話でしょうか.それとも個別の潜在空間$\mathcal{U}$の話でしょうか

個別の潜在空間の話です.

@TetraMiyazaki
Copy link
Contributor

TetraMiyazaki commented May 26, 2022

y_zn.mp4がデータの推定値とデータとの比較の動画だと思います.これを見る限り,学習は出来ている!?

あ,本当ですね!これをみると,$x_{ij} \simeq f(u_i, u_j)$という学習はできてそうですね.

@TetraMiyazaki
Copy link
Contributor

個別の潜在空間の話です.

なるほど,$\mathcal{U} \times \mathcal{V}$の直積空間の次元数はそれぞれ2と2だったら4次元になりますね.つまり,4次元多様体でfittingするような感じになります.一方でそれぞれの次元数が1と1だったら2次元になります.

@ryusei-iki
Copy link
Contributor Author

u,vの潜在空間を両方とも一次元にしてみました.
そしたら,線にしかならなかったです.

潜在空間は,uの最小値から最大値のlinspace 100,vの最小値から最大値のlinspace 100としている.

wire_zk.mp4

計算式が間違っているかと思い,学習に用いた潜在空間を使ってみたら,同じところに出来たので,計算式は間違っていないと思う.

wire_zk.mp4
y_zn.mp4

最初のやりかたでは潜在空間が関係データっぽくなかったので,学習時の潜在空間ををソートして([[9,2][2,2][9,1][2,1]]とあったら,[[2,1][2,2][9,1][9,2]])としたら,また線になった.欠損のない関係データにしているから,ソートをしても組み合わせは変わらずに順番が変わるだけだから,少なくとも,y_znのように点が散らばると思ったが,そうではなかった.

wire_zk.mp4
y_zn.mp4

@TetraMiyazaki
Copy link
Contributor

TetraMiyazaki commented May 26, 2022

@ryusei-iki
今学習した潜在変数$\hat{z}$を入力とした$\hat{f}(\hat{z})$場合は問題がなく,新しく作った$\zeta$の$\hat{f}(\zeta)$写像がうまくいってないという状態ですよね.
学習の時に作った真の潜在変数を入力してみてそれでも$\hat{f}(z_{true})が$うまくいかない場合は,学習がうまくいってない or 描画が間違っている.
うまくいく場合は,新しく作ったzetaの作り方が間違っている or なにか起きてる みたいな感じで推測できると思うので,
真の潜在変数を入力してみると色々わかるかもです.

@ryusei-iki
Copy link
Contributor Author

最初のやりかたでは潜在空間が関係データっぽくなかったので,学習時の潜在空間ををソートして([[9,2][2,2][9,1][2,1]]とあったら,[[2,1][2,2][9,1][9,2]])としたら,また線になった.欠損のない関係データにしているから,ソートをしても組み合わせは変わらずに順番が変わるだけだから,少なくとも,y_znのように点が散らばると思ったが,そうではなかった.

学習時の潜在変数をソートしたらワイヤーフレームは表示することはできた.
ただソートを間違っていただけだった.なぜ線になってたかというと,片方の潜在変数が一つの値を繰り返してたから.だから,zetaで線になるのも同じ理由かも知れないから確認する.

wire_zk.mp4
y_zk.mp4
y_zn.mp4

@ryusei-iki
Copy link
Contributor Author

ただソートを間違っていただけだった.なぜ線になってたかというと,片方の潜在変数が一つの値を繰り返してたから.だから,zetaで線になるのも同じ理由かも知れないから確認する.

zetaを確認したら,片方の潜在変数が一つの値を繰り返してはいなかった.他に線になる理由を見つけた.uとvを両方とも単調増加させてペアにしてたのが線になる理由だと思う.zetaを100にするとしたら,今まではnp.arange(100)にしていた.これをnp.arange(10)を作って,その組み合わせで100個のペアを作った.そしたら出来た.

wire_zk.mp4
y_zk.mp4
y_zn.mp4

@TetraMiyazaki
Copy link
Contributor

uとvを両方とも単調増加させてペアにしてたのが線になる理由だと思う.zetaを100にするとしたら,今まではnp.arange(100)にしていた.これをnp.arange(10)を作って,その組み合わせで100個のペアを作った.そしたら出来た.

なるほど!!!!ナイファイっす!!!ほんとに.

@TetraMiyazaki
Copy link
Contributor

徳永くんにもいったんですが,いきくんもvisualizerのprojectに関わってるので,
ミニマムが終わり次第すぐに,スタンダードサクセスの描画方法を変更する.のCCPの実装を優先して取り掛かりましょう.

@ryusei-iki
Copy link
Contributor Author

TUKRのtensorでの実装が出来ました.

wire_zk.mp4
zn1.mp4
zn2.mp4

@hirowatari-s
Copy link
Contributor

hirowatari-s commented Jun 3, 2022

さすが!!!いい感じですね!
潜在空間のプロットは範囲を-1から1に固定するのがおすすめです!
誤差関数のプロットは上でやってるね,見落としてました...
あ,優先度高くないので,他のタスクやるのが良きかもです.

@ryusei-iki
Copy link
Contributor Author

潜在空間を-1から1にすると,見やすくなりました.

zn1.mp4
zn2.mp4

損失はこんな感じで減っていました.
20epochぐらいの動きが良く分かっていないです.

loss
loss_mse
loss_L2

@hirowatari-s
Copy link
Contributor

hirowatari-s commented Jun 3, 2022

早速対応してくれてありがとう!
損失3枚プロットしてくれてるけど,どう違うやつかな?
あ,全てと二乗誤差と正則化誤差かな?
30エポックぐらいまでをゆっくり観測空間と潜在空間プロットしてみたらなんか見えるかも?

@ryusei-iki
Copy link
Contributor Author

あ,全てと二乗誤差と正則化誤差かな?

そうです.

30エポックぐらいまでをゆっくり観測空間と潜在空間プロットしてみたらなんか見えるかも?

やってみます.

@TetraMiyazaki
Copy link
Contributor

20epochぐらいの動きが良く分かっていないです.

広渡さんもいってますが,ここに着目するのはかなりいいと思うので,観察してみるとよいです

Copy link
Contributor

@TetraMiyazaki TetraMiyazaki left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

観測空間の色付けとここの潜在空間のの色付けの対応がわからないです.
UKRのときはちゃんとデータの位相がとれているかを色付けで確認しましたよね.関係データのほうもちゃんと位相がとれているかを色付けで示すようにしてください.

        self.ZN1_calc=np.zeros((self.X1_num*self.X2_num,self.L))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants