2023年5月24日水曜日

GPTでPytorchを使ったニュートン法をやってみる

おじさん、最近、自動微分とか自動ベクトル化の勉強にはまっています。

JAXとかfunctorchとかものすごい勢いで開発されてるし。

ここでLLMが500億円で計算できるか50億円で計算できるか決まるしね。

だけどドキュメントがまったくない・・・・・。

--------

Why functorch?

This library is currently under heavy development - if you have suggestions on the API or use-cases you'd like to be covered, please open an github issue or reach out. We'd love to hear about how you're using the library.

functorch is JAX-like composable function transforms for PyTorch.

--------

このへん、ちょー開発中なのね。

おじさん、自動微分ってディープラーニングだけじゃなくて、制御や物理シミュレーションや数値計算、株価予想とかいろいろ面白い使い方があると思っているのですが、自動微分を使ったニュートン法とかの基礎的なサンプルコードがないからまだ誰も使ってないと思っています。

株価の予想に自動微分使って一儲けできないかなぁ。とか書くとめちゃくちゃ怪しいメールがたくさん来ます。


おじさんChatGPTに、PytorchのC++APIを使ってニュートン法を自動微分でするサンプルをお願いしてみました。



けど、最新の部分ってChatGPTもわからない・・・。というかChatGPTって誰かが書いたコードをコピペしかできないでしょ。動かない適当なコードばっかりはくし、オリジナルのコード全くかけない。


しょーがないなー。

というわけで、まだ世界でだれも作っていない、バックプロパゲーションの基礎の基礎であるニュートン法をC++でPytorchの自動微分機能を使ってするサンプルを自分で書いてみました。

----------------------------------

 #include <torch_torch.h>


torch::Tensor f(const torch::Tensor& x_tensor)

{

torch::Tensor y = x_tensor * x_tensor - 2;

return y;

}


float newtonMethod(float x) {

torch::Tensor x_tensor = torch::tensor(x, torch::requires_grad());

torch::Tensor y;


for (int i = 0; i < 5; ++i) {

y = f(x_tensor);

y.backward();


torch::Tensor grad = x_tensor.grad();


x_tensor.data() -= (y / grad).data();

x_tensor.grad().zero_();

std::cout << x_tensor.item<float>() << std::endl;

}

return x_tensor.item<float>();

}


int main() {

float initial_guess = 5.0;

float result = newtonMethod(initial_guess);

std::cout << "Approximate solution: " << result << std::endl;

return 0;

}

----------------------------------

oneDnn+flashlightも使ってみたいのでいろいろ調べているのですが、どのライブラリもAPI似てますね。


結果

----------------------------------

2.7

1.72037

1.44146

1.41447

1.41421

Approximate solution: 1.41421

----------------------------------

できた!

これを変数でなくて複雑なベクトル関数でやるとバックプロパゲーションになるのね。



0 件のコメント:

コメントを投稿