Visual C++ 2022でPLplotを使う際にフォントファイルが無いと怒られる場合

【環境】

【問題】
 vcpkgのリポジトリにPLplotがあったのでインストールし、サンプルプログラムを走らせてみたが、以下のエラーが出る。

*** PLPLOT ERROR, IMMEDIATE EXIT ***
Unable to either (1) open/find or (2) allocate memory for the font file
Program aborted

【解決手段】
 PLplotが使うフォントデータが無いと怒られている様なので、vcpkg\installed\x64-windows\share\plplot\data、の中を探してみたらパレットファイルというものと共にインストールされており、どうやらこれを読む設定を自動ではしてくれないので回避策を採った。
 一番単純な方法としては上記ファイルを全コピーし、実行ファイルやプロジェクトファイルと同じディレクトリ(デバッグ時のみ)に置くことで解決する。
 vcpkgでライブラリのインストールを行ってくれるところまではいいが、これはちょっと洗練されていない。
plplot.sourceforge.net

【書評】IT Text 自然言語処理の基礎 (2022年版)

 IT Text 自然言語処理の基礎 (2022年版)について。

 この本は、いわゆる天下り説明詰め込み本で、わかっている人向けには復習と新知識の学習用にちょうど良く、初学者にはきついだろう。
 日本の学者がよく書きがちな、初心者殺し本。
 現代的な深層学習ライブラリで用いられている計算グラフ等の説明もほぼされておらず、数ページ割かれているだけだが、最近のライブラリは計算グラフの理論と実装を自分で理解しなくても使えるから端折っていいでしょという意図はわかる。
 計算グラフから最も効率よく学べる書籍は斎藤康毅氏の「ゼロから作る~シリーズ」だろう(変換候補で氏名がすぐに出てこないところがつらい)。このシリーズは本当に素晴らしく、日本の宝であると断じて良い。
 本を出す世の中の研究者や学者には二種類おり、悪書を出す学者と良書を出す学者である。
ただしこれは、本記事の主題である書籍が悪書だと言っているわけではない。 「IT Text 自然言語処理の基礎」は、深層学習フレームワークの使い方に慣れている人が見れば、この本に書いてあるモデルからある程度実装できるようには書かれており、どういった処理や概念が使われているのかそれなりに網羅されているところは良い。 しかし何度も言うが、初学者がこれを読んで納得できるものだとは到底思えない。

vcpkg+Visual Studio 2022でboostをビルドしてもvc140のライブラリしか生成されない時

【環境】

【目的】
 vc143(VC++2022)用のboostをvcpkgでビルドしてインストールする。

【問題】 
 VS2022ツールセットしかインストールされていないにも関わらず、なぜかvc140という接尾辞が付いたライブラリしか生成されず、boost-serializationなどのライブラリが必要な時、リンカーにライブラリが読めないとか怒られる。
 vcpkgのtriplet(cmakeの追加設定みたいなもの)でVCバージョンやVSのインストールディレクトリを指定しても解決できない。

【試行1】
 boost-modular-build.cmakeから、

string(REGEX REPLACE "-vc14[1-9]-" "-vc140-" NEW_FILENAME ${NEW_FILENAME}) # To merge VS2022 VS2019 VS2017 and VS2015 binaries

という、vc140系でビルドしたバイナリはマージするよ、的な事が書いてある邪悪な行をコメントアウトしてみたところ、vc143の接尾辞が付いたファイルは生成されたものの、ビルド中に以下のエラーが発生。もう・・・なんなの・・・

error: building boost-thread:x64-windows failed with: BUILD_FAILED
Elapsed time to handle boost-thread:x64-windows: 5.3 s
Please ensure you're using the latest port files with `git pull` and `vcpkg update`.
Then check for known issues at:

【試行2】
 cmakeファイルではファイル名を置換しているだけっぽいので、生成した後にリネームする方針で試してみる・・・どうやらこれでいけるっぽい
 VC++が出すエラーメッセージが求めてくるファイル名に直してやれば、vcpkgからロードしてくれる様になる。
 リネームしなくても読める方法があるのかもしれないが、そのような邪悪な手段は考えたくもない。
 ファイル名の一括置換のためのPowerShellスクリプトはここで教えてもらった。

【問題の原因と一応の結論】
 boost-modular-build.cmakeにおいて、出来上がったライブラリの接尾辞をわざわざvc140に置き換えている。
https://github.com/microsoft/vcpkg/blob/master/ports/boost-modular-build-helper/boost-modular-build.cmake
 どういう積りでこうしているのか知らないが、VC++プロジェクトでビルドしたときに求められるのは、VCのバージョンに適した接尾辞が付いているライブラリファイル名なので何も良い結果になっていない。
 バグと断じて良いだろう。
 試行2の様にビルドした後のリネームで対応するのが無難か。

Pythonはプリミティブな思考力を低下させる

 巷ではとりあえずpythonで、となっている。
 よく抽象化されていて端的に書けるという触れ込みが多かったが、これは理論とプリミティブな実装について理解のある者の立場から言っている事であり、初学者やそれ以外にとっては何も端的な記述には見えないだろう。
 むしろプログラマの思考では拒絶反応を示したくなるようなものが多い。

【書評】作ってわかる!自然言語処理AI 坂本俊之 (著)

 ChatGPT等で話題になって暫く経つTransformerについての和書。
 具体的且わかりやすそうに書かれているのだが、数学用語と図が一致しておらず、文脈からこちらが解釈する必要があり、無駄に時間がかかる点が残念だった。
 ベクトルなのか行列なのか分かりづらく、よく読んでみると行列同士の積の説明だった、といった様な箇所が多く、図も行列をベクトルのように記述したりしており非常に読み辛く、絵本の様に初学者に理解させたいのかもしれないが、はっきりいってこの点はほんとに駄目。
 また、既存のNNライブラリの使用を前提としているため、計算グラフ等での実装手法が説明されているわけではない。
 Attentionの解説についても、このシンプルな計算がなぜ良い注意機構になるのかという理論的な背景もなく、初心者には意味がわからないだろう。
https://www.amazon.co.jp/gp/product/B09PYFZKGY/ref=ppx_yo_dt_b_d_asin_title_351_o09?ie=UTF8&psc=1

libtorchに於いてleaf-tensorのgrad()を呼び出すと怒られる

 libtorchの公式サンプルをいじっていて、ネットワークのリーフノードの勾配を取得したらどうなるか試した所、以下のようなWarningが出た。

y.grad() = [W TensorBody.h:494] Warning: The .grad attribute of a Tensor that is not a leaf Tensor is being accessed. Its .grad attribute won't be populated during autograd.backward(). If you indeed want the .grad field to be populated for a non-leaf Tensor, use .retain_grad() on the non-leaf Tensor. If you access the non-leaf Tensor by mistake, make sure you access the leaf Tensor instead. See github.com/pytorch/pytorch/pull/30531 for more informations. (function grad)

 ネットワークの終端でスカラー出力の場合、その勾配は1なので、1が出力されることを期待したのだがそうはならんらしい。
 backward()呼び出しの際にいい感じで処理するようにできているようだ。

libtorchでmnist学習サンプルプログラムがデータのロード時にランタイムエラーや例外を出す時

 LibtorchはPytorch C++ Frontendなどとも呼ばれており、Tensorflowなどに比べてVisual Studioへの組み込みが簡単なのだが、環境を構築した後に試せと至るところで書かれているMNISTデータセットでの学習サンプルプログラムがデータ読み込みの時点でよくコケる。
 結論から言えば、MNISTデータセットの圧縮ファイルを解凍した後にできるファイルの名前が間違っているだけなのでそれを修正すれば問題ないのだが、未だにLibtorch側でもMNIST側でも問題への対応はなされておらずクイズの様になっており、色々調べた結果、下記のQiita日本語記事に助けられ解決策を知る。ありがとうサッサ・ヤスアキ
qiita.com 
 具体的には解凍されたファイル名を以下のように書き換える。ハイフンがピリオドになってしまっているところをハイフンに直す。

train-images.idx3-ubyte ▶ train-images-idx3-ubyte
train-labels.idx1-ubyte ▶ train-labels-idx1-ubyte
t10k-images.idx3-ubyte ▶ t10k-images-idx3-ubyte
t10k-labels.idx1-ubyte ▶ t10k-labels-idx1-ubyte

 Visual Studioにlibtorchを組み込む手順はこのあたりがシンプルで良かったのだが、上記問題には触れられておらず、設定後に暫く地雷を踏み続ける事になった。