おじさん、最近、自動微分とか自動ベクトル化の勉強にはまっています。
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 件のコメント:
コメントを投稿