サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
TGS2024
qiita.com/kaityo256
はじめに テンソルネットワークなどで、テンソルをグラフで表現することがよくあります。慣れるまでは見ても良く分からないのですが、慣れると人に説明する時とかに便利なので、ここで表記についてまとめておきます。 (追記) 最初、「私がこの表記方法を初めて見たのはG. Vidalのセミナーだったが発案者は知らない」と書いていたら、コメント欄にて発案者はあのペンローズだと教えていただきました。 グラフ表記法 シンボルと足の数 テンソルのグラフ表現では、テンソルをシンボル(四角や丸など)、テンソルの足をシンボルから出る線で表現します。線の数がテンソルの階数(Order)です。まず、全く足がないものは0階のテンソル、すなわちスカラーです。足が1本のものはベクトル、2本のものは行列、3本なら3階のテンソル、n本ならn階のテンソルです。 縮約 グラフ表現でもっとも重要なのは足の縮約です。グラフの線を結んだら、
はじめに 履歴書、書いてますか?>挨拶 僕もいま任期付きなもんで履歴書を書いては送る日々なわけですが、履歴書ってなんであんなに書きづらいんでしょうね? で、これまでは履歴書をLaTeXで書いて管理してたのですが、ちょっとスタイルを修正するのもすごく面倒だし、そもそもデータとスタイルの分離がよろしくないのがストレスでした。そんな時にこの【退職】履歴書をGit管理したかってん【しました】という記事を見て、僕も履歴書をもう少し扱いやすいフォーマットから作るスクリプトを書きました。ソースはGitHubに置いてあります。 (2020年7月19日追記) 2020年7月17日付で、日本規格協会グループは、JIS Z 8303『帳票の設計基準』に掲載されていた「履歴書」の様式例を削除しました。2020年7月19日現在は「お知らせ」に記載されていますが、パーマネントリンクが無いようなので、そのうち消えるかも
どうも、ロボ太(kaityo256)です。趣味は他人のAdCを乗っ取ることです(乗っ取るとは言ってない)。これまでもスパコンポエムをいくつか書いてきましたが、せっかくスパコンポエムAdCがあるので一日お邪魔させてもらいます。 スパコンランキング スパコンにはTop500という有名なランキングがあります。HPLという、バカでかい連立一次方程式を解いて、その性能を競うものです。その名の通り、世界で上位500位までがランキングに入ります。6月と11月の年に二回開催され、ISCやSCという会議で発表されます。ずいぶん昔、「二位じゃダメなんでしょうか?」で有名になった事業仕分けにおいて、スパコンにおける一位とか二位というのは、狭義にはこのランキングでの順位を指しています。HPLがスパコンの性能評価として妥当かどうかについて、以前ポエムを書いたのでそっちを参照してください。 さて、このランキングの良い
はじめに どうにもMacのSIGBUSやSIGILLを出すポリシーがよくわからないので、特徴的なコードをまとめておく。環境依存の可能性大。あとで何か見つけたら追加するかも。 環境はこんな感じ。 macOS High Sierra 10.13.3 g++ (Homebrew GCC 7.2.0) 7.2.0 結果 文字列領域への書き込み 文字列領域に何か書き込もうとするとSIGBUSが出ます。
TL;DR numpy.matrixは非推奨。numpy.ndarrayと@演算子を使いましょう。 はじめに 少し前に「大名行列を特異値分解してみる」という記事を書いたところ、元同僚さんから「numpy.matrixはdeprecatedですよ」と言われて驚きました1。 調べたらStackOverflowにやたら詳しい解説が載っていたので、それをもとに説明してみようと思います。 特異値分解とmatrixクラス 線形代数に特異値分解(Singular Value Decomposition, SVD)という処理があります。m行n列の行列Xを、m行m列のユニタリ行列U、m行n列の対角行列S、n行n列のユニタリ行列Vの積に分けるというものです。なんか適当な行列を作ってみましょう。 import numpy as np from scipy import linalg X = (np.arange
はじめに 線形代数には、特異値分解という操作があります。行列を特異値と、それをくくりだす行列に分解する処理です。この分解は可逆処理ですが、特異値の大きいところだけを取り、小さいところを無視することで元の行列を近似することができます。近年、この性質を利用した情報圧縮が様々な場所で積極的に利用されています。筆者の身近なところでは、量子状態をテンソルネットワークで近似する際、特異値分解が中心的な役割を果たします。 本稿では、特異値分解がどういう処理なのか、実際に簡単な行列で試してみて、「なるほど情報圧縮だなぁ」というのを実感することを目的とします。 コードは以下においておきます。 https://github.com/kaityo256/daimyo_svd Google ColabでJupyter Notebookを開きたい場合はこちらをクリックしてください。 まず細かいことはさておき、特異値
TL;DR 確率密度$f(x)$に従う連続な確率変数$\hat{X}$を作るには、累積分布関数$F(x)$と$0 \leq \hat{R} < 1$の一様乱数$\hat{R}$を使って$\hat{X} = F^{-1}(\hat{R})$とすれば良い(逆関数法)。 はじめに 任意の確率密度分布を持つ確率変数を作りたい時があります。典型例が「球面上に一様に分布する点」を発生させる場合です。これは、例えば三次元空間上に速度の絶対値は同じだが向きをランダムに与えたい時なんかに必要です。 一般にプログラムで得られる(疑似)乱数は0から1の一様乱数です。本稿ではこれを使って任意の確率密度分布を持つ乱数を作る方法の説明と、いくつかの具体例を見てみましょう。 確率密度関数と累積分布関数 連続値を取る確率変数$\hat{X}$があるとします。この変数が$a$と$b$の間の値を取る確率が
はじめに いま、この記事を見ているのはパソコンだったりタブレットだったりスマホだったりするでしょうが、それらのデバイスにはCPUが入ってます。このCPU、様々な種類があり、ノートPCなら例えばIntel Core、スマホならARM Cortexなんかが入っているでしょう。このCPUですが、いろんな関連単語がネットニュースに飛び交います。例えばIntelのXeonやCore、Skylake、Kaby Lakeといった単語の関係や、AMDのZenとRyzenの関係など、よく目にするわりにその意味をちゃんとは知らない、という人は多いんじゃないでしょうか。 本稿では、わりとあいまいにされがちなCPUのベンダー、ブランド、命令セット、マイクロアーキテクチャといったキーワードについて簡単に説明してみようと思います。たとえ話の常として、どうしても正確性は犠牲になりますので、ガチ勢は「もどる」ボタンを押し
その1:Xbyakの概要←イマココ その2:数値計算屋のハマりどころ その3:AAarch64向けの環境構築 その4:Xbyakからの関数呼び出し その5:Xbyakにおけるデバッグ はじめに Xbyak(カイビャック)は、光成滋生さんによるJITアセンブラです。Intelによる深層学習ライブラリoneDNNのエンジン部分の実装に使われたり、AArch64版のXbyakであるXbyak_aarch64が富士通のリポジトリとして公開されたりと、ベンダーによる公式採用が増えています。なんかすごそうなので使ってみましょう、という記事です。 Xbyakの準備 Xbyakは、JITアセンブラです。C++ヘッダオンリーなので、インクルードするだけで使えます。git submoduleとして使うのが良いと思います。 まずは適当なリポジトリxbyak_testを作りましょう。
はじめに 何かデータをフーリエ変換したくなることがある。例えば先生から「そのデータ、フーリエ変換してみたら?」と言われた時とか。なんとなくフーリエ変換がどういうものかは知っていて、PythonとかのライブラリにFFTがあるからデータを食わせればすぐ変換できるということも知っているが、なんとなく定義に自信が無い、そんな時もあるだろう。 そういう場合は、厳密にフーリエ変換がわかるような単純な系について実際にデータを食わせてみて、理論値と一致することを確認するのが望ましい。しかし、実際にやってみると「アレ?」と思うことが結構ある。以下ではPythonでFFTをする時の注意点等を紹介する1。 ガウス分布 ガウス分布のフーリエ変換 まずはフーリエ変換の定義から確認しておこう。ある関数$f(x)$のフーリエ変換$\hat{f}(k)$は $$ \hat{f}(k) = \int_{-\infty}^\
はじめに Rui UeyamaさんのCコンパイラ作成集中講座 (2020) 第14回を聞いて知ったのですが、GCCは「同じマクロ」が定義された時に、マクロの再定義警告をしないんですね。例えばこんなコードです。 #include <cstdio> #define A 1 #define B 1 #define A 1 // No warning #define B 2 // test.cpp:7:0: warning: "B" redefined int main() { printf("%d %d\n", A, B); }
TL;DR ある環境でビルドできたDockerfileが別の環境でビルドできなかったのは、メモリ制限のせいだった はじめに 理研シミュレータというシミュレータがあります。 RIKEN-RCCS/riken_simulator これは、「京」の次のスーパーコンピュータ「富岳」が採用しているアーキテクチャ「Fujitsu A64FX」のシミュレータです。Gem5というアーキテクチャシミュレータがあり、それにARM AArch64を実装したものです。 これを使うと、AArch64のプロセッサレベルでのシミュレートができるのですが、ビルドに結構手間がかかります。なので、その「手間」をまとめたDockerファイルを作りました。 kaityo256/aarch64env Dockerファイルはこんな感じです。 FROM ubuntu:18.04 MAINTAINER kaityo256 ENV USE
はじめに 実験でも数値計算でも、観測に誤差が伴うものをグラフにする時にはエラーバー(誤差棒)をつけると思います。エラーバーのつけ方には流儀がありますが、とりあえず1シグマ、つまり「誤差の乗り方がガウス分布だと仮定した時の標準偏差」をエラーバーとすることが多いです。 で、エラーバーは1シグマなので、「真の値をそのエラーバーの中に含む確率」が68%です。つまり観測点の3つに1つは「真の値」がエラーバーの範囲外にあることになります。なお、ここでは「真の値」を「観測を十分な回数繰り返した時に収束する値」のこととします。 さて、発表を見ていて、たまに「ん?」と思うようなグラフを見かけます。以下では、そんな「ん?」なグラフの実例と、その原因について見てみようと思います。 ケース1:正しい誤差棒 入力値$x$に対して、観測値$y$が$y=x$となる単純な系を考えましょう。ただし、観測するたびに誤差$\v
TL;DR 1〜3桁の整数sizeがあり、そこから例えばL064.datみたいなファイル名を作りたい時、Rubocopに怒られないようにするには とすれば良い。これだけなんだけど、ここまで来るのに妙に苦労したのでRubocopの文句からこの記事にたどり着けるように詳細を書いておきます。 Rubocopに怒られる C言語っぽく 1〜3桁の整数sizeがあり、そこから例えばL064.datみたいなファイル名を作りたい。C言語から入った人ならsprintf使ってこんな感じに書くと思う。
はじめに スピン系をモンテカルロシミュレーションする時、Swendsen-Wang法やWolff法など、Fortuin-Kasteleyn表現を用いたクラスターアップデートアルゴリズムを使うと非常に効率良くサンプリングができます。さらに、Fortuin-Kasteleyn表現が得られている時、普通にサンプリングするよりも分散が小さくなるImproved Estimatorを構成できます。 本稿では、Ising模型の磁化やビンダー比のImproved Estimatorの導出と、どのくらい分散が小さくなるのかの説明をします。 コードは https://github.com/kaityo256/mc/tree/master/improved_estimator に置いておきます。 Improved Estimatorとは サイコロとコインの例 Improved Estimatorを一言で言うと
はじめに エンジニアないないという記事を読んで、「そうそう、専門の人と一般の人って、結構認識違ってたりするよなぁ」と思ったので、スパコンについて似たようなことを書いてみようと思います。オープンキャンパス的なイベントで来訪者にスパコンについて説明したりしている時に質問されたことが中心です。 スパコン使えばものすごいゲームできるんですか? これ、わりとよく聞かれるんですが、基本的にはできません。「ものすごいゲーム」のイメージは、例えば「ものすごいグラフィック」「ものすごく精密な物理エンジン」「ものすごく大量のキャラクター」なんかだと思うんですが、そもそも一般的なスパコンはリアルタイム処理向けに作られておらず、「バッチジョブ」という形で計算を予約して、計算資源が空いたら実行される、みたいな使い方をします。スパコンは「一ヶ月かかる計算を1日で処理する」みたいな加速は得意ですが、「0.1秒かかる処理
def check(n) s = "*"*n f = open("test.cpp","w") f.puts <<EOS #include <cstdio> int main(){ (#{s}printf)("Hello World\\n"); } EOS f.close() return system("clang++ test.cpp") end check(ARGV[0].to_i) $ ruby check.rb 10000 clang: error: unable to execute command: Illegal instruction: 4 clang: error: clang frontend command failed due to signal (use -v to see invocation) Apple LLVM version 10.0.1 (clang
はじめに プログラマは計算機に対して、「別に凝ったをやれとは言わないが、自明なことはやってくれよ」と思うものだ。例えば規則格子における差分法、特に陽解法は、式と差分方式さえ決まれば、(最適化とか考えなければ)後は自明なコーディングになる。さらに、領域分割による分散メモリ並列を考えた時、(効率とか考えなければ)やはり自明なだけで面倒なコーディングをする必要がある。 こういう「自明かつ面倒なコーディング」をやらなければいけなくなった時、「自動化したい」と思うのは自然な発想だ。Formuraは、まさにそのような思想で作られた、格子計算プログラム生成言語(というかフレームワーク)である。 本稿では、このFormuraを使ってみる。 その1 インストールとコンパイルまで ←イマココ その2 一次元熱伝導方程式 その3 二次元熱伝導方程式 その4 反応拡散方程式(Gray-Scott系) インストール
はじめに 一般に、コンパイラによる最適化は局所的であればあるほど効きやすい。例えば同じ関数内ならできる最適化が、グローバル変数がからむとできなくなったり、ファイルをまたぐとできなくなったりする。しかし、最近はリンク時最適化(Link Time Optimization, LTO)と呼ばれる、異なるオブジェクトファイル間にまたがる最適化ができるようになってきた。 ここではいくつかの例で、リンク時最適化として何ができるか紹介してみたいと思う。使うコンパイラは以下の通り。 g++ (Homebrew GCC 7.3.0_1) 7.3.0 clang++ Apple LLVM version 9.1.0 (clang-902.0.39.2) リンク時最適化の例 簡単なサンプルを示そう。 こんなコードを考える。 #include <cstdio> int func() { return 1; } i
はじめに 配列を定数(const)として宣言した場合や、事実上定数とみなせる場合、コンパイラが定数畳み込み最適化をできるか確認する。 定数畳み込みについて コンパイラの最適化には様々なものがあるが、その最も簡単なものに「定数畳み込み」がある。これは、コンパイル時に定数であることがわかっている式を単純化するものだ。 例えば、こんなコードを見てみる。 const double G = 9.8; const double dt = 0.01; const int N = 10000; void func(double v[N]) { for (int i = 0; i < N; i++) { v[i] += G * dt; } } 速度の配列vを受け取り、そのすべての要素に重力定数Gと時間刻みdtの積G*dtを加算するコードだ。このコードを見て、「毎回メモリからGとdtの値を取ってきて、掛け算し
はじめに 「サイゼリヤで1000円あれば最大何kcal摂れるのか」を量子アニーリング計算(Wildqat)で解いてみた。 「サイゼリヤで1000円あれば最大何kcal摂れるのか」をSMTソルバー(Z3)で解いてみた。 「サイゼリヤで1000円あれば最大何kcal摂れるのか」を整数計画法ソルバー(PuLP)で解いてみた。 N番煎じですが、これらの記事を見てマルコフ連鎖モンテカルロで解いてみました。コードは以下に置いてあります。 https://github.com/kaityo256/saizeriya_mc 方針 全メニューについて、「注文する/しない」を0/1の状態ベクトルとして、そのベクトルについて最適化をかけます。カロリーをエネルギーとして、カロリーを最大化するようにします。試行は「メニューの追加/削除」の二種類です。状態の更新はメトロポリス法を使います。すると、メニューの追加試行は
はじめに 少し前(2019年4月頃)に、「AI人材」という言葉がニュースを賑わせていました。「現在流行っているディープラーニングその他を使いこなせる人材」くらいの意味だと思いますが、こういうバズワードの例の漏れず、人によって意味が異なるようです。併せて「AI人材のために線形代数の教育をどうするか」ということも話題になっています。 線形代数という学問は、本来は極めて広く、かつ強力な分野ですが、とりあえずは「行列とベクトルの性質を調べる学問」と思っておけば良いです。理工系の大学生は、まず基礎解析とともに線形代数を学ぶと思います。そして、何に使うのかわからないまま「固有値」や「行列式」などの概念が出てきて、例えば試験で3行3列の行列の固有値、固有ベクトルを求め、4行4列の行列の行列式を求めたりしてイヤになって、そのまま身につかずに卒業してしまい、後で必要になって後悔する人が出てきたりします(例え
TL;DR VSCodeでコピーする際に、「書式なし」でクリップボードにコピーするためには「設定」の「テキストエディター」の「Copy With Syntax Highlighting」のチェックを外す この状態で「書式付き」でコピーするには、コマンドパレットから「Copy With Syntax Highlighting」を実行する。 なお、記事執筆時点のVSCodeのバージョンは1.33.0。 はじめに 最終的にWordで提出しなければならない書類でも、最初はテキストエディタで書いて、最後に貼り付けて体裁を整える、ということをやっている人は多いと思う。しかし、最近のVSCodeはデフォルトでコピーが「書式つき」になっている。そうすると、例えばVSCodeで「プレーンテキスト」で書いているつもりが、Wordに貼り付けると背景色などがコピーされて困ることになる。 Wordなどは「形式を選択
はじめに 理工学部の学生にとって、フーリエ変換、ラプラス変換は必須の科目であろう。しかし、フーリエ変換については物理的な意味がわかりやすく、変換もきれいなので受け入れられる学生さんも多いのだが、ラプラス変換については「逆変換の積分がなぜ複素平面を「縦」に、しかも軸がずれて走るのかわからない」とか「微分をラプラス変換するとゴミがでるのが気持ち悪い」など、「フーリエ変換に比べると美しくない」と感じる人がいるようだ。 しかし、ラプラス変換とフーリエ変換はきってもきれない仲である。本稿では、あまり話題にされないラプラス変換とフーリエ変換の関係についてまとめておく。 まず、フーリエ変換を定義しておこう。変換前の変数を$x$、変換後は$k$としよう。これは実空間と波数空間に対応する。関数$f(x)$のフーリエ変換は以下のように定義する。 $$ \mathcal{F}[f] \equiv \tilde{
はじめに malloc沼、ハマってますか?>挨拶 僕はどっぷりハマってもうイヤになりました。必要に応じてメモリを確保し、解放するという、一見単純な作業はとても奥が深いです。 特にglibc mallocはかなりアドホックなことをやっており、チューニング可能なパラメータがたくさんあります。それらのパラメタは、多くの一般的なアプリケーションでそこそこの性能が出るように選ばれていますが、アプリケーションによっては相性が悪く、性能が劣化する場合があります。その場合、mallocに関連するパラメタをいじる必要がでてきますが、これがなかなか面倒だし、設定したことでどんな変化が表れるかがわかりにくいことが多いです。 本稿では、環境変数から設定可能なmalloc関連のパラメタをいくつか紹介します。特に、環境変数を設定することで振る舞いがなるべくわかりやすく変わるサンプルコードを用意しました。 malloc
はじめに 今年(2019年)のゴールデンウィークは10連休だそうで、高速道路が相当混むことが予想される。車での移動において、渋滞は頭の痛い問題だ。では、渋滞はなぜ起きるのだろうか? よく言われるのが「坂道が始まるところで渋滞が起きる」というものだ。坂道では知らないうちに車のスピードが落ちる。すると車間距離が縮まることで、後続の車がブレーキを踏み、それを見たさらに後ろの車がブレーキを・・・と連鎖して、最終的に渋滞になると説明される。また、ドライバーなら合流地点があったり、車線が狭くなるところなどでよく渋滞が起きることも経験的に知っているだろう。合流地点や車線が狭くなるところは流量が落ちるから詰まって渋滞になりやすそうである。 しかし、これらは「渋滞がどこで起きやすいか」ということを説明しているに過ぎず、「渋滞がなぜ起きるか?」ということの答えにはなっていない。そもそも渋滞はなぜ起きるのか?何
はじめに 「それぞれのビットが、確率$p$で1となっているようなランダムなビット列」が欲しくなる時ってありませんか?例えばスピン系とかのマルチスピンコーディングとかする時に必要だったりします。マルチスピンコーディングというのは、スピンの自由度をビットとしてパックして、同時に複数のスピンの状態を更新する手法で、ビット演算の並列性を使って計算を加速します。 さて、「指定の確率でビットが立っているランダムなビット列」はどうやって作ればよいでしょうか。もっともナイーブには、ビットの数だけ乱数を使えばそんなビット列を作ることができます。32ビットならこんな感じでしょうか。 uint32_t rbs(double p, std::mt19937 &mt){ std::uniform_real_distribution<> ud(0.0,1.0); uint32_t v; for(int i=0;i<3
はじめに 「割りばし」という二人で行う指遊びがある。地方によって名前やルールは様々だが、基本ルールは以下のようなものだ。 じゃんけんなどで先行、後攻を決め、お互い両手の人差し指を立てる 先行は、自分の好きな手で相手の好きな手を攻撃する 攻撃された側は、攻撃された手の指を、攻撃した手の指の本数だけ増やす この時、もし指が5本以上になったらその手は死ぬ これを交互に繰り返し、両手が死んだら負け 追加ルールやバリエーションとして、以下のようなものがある。 modルール:攻撃されたとき、「ちょうど5」でなければ死なず、指の本数は5で割った余りになる 分身ルール:自分の手番で、手が一本死んでいるとき、指の総数が変わらないように両手に指を分けることができる 自分攻撃:自分の手で自分を攻撃することを許す 特にmodルールはかなり広い範囲で採用されているようだ。うちの地域では「割りばし」と呼ばれているもの
次のページ
このページを最初にブックマークしてみませんか?
『@kaityo256のマイページ - Qiita』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く