確率的勾配降下法とは何か

機械学習において確率的勾配降下法(Stochastic gradient descent, SGD)ってよく耳にするけどよく分からない。「確率的勾配降下法 わかりやすく」でググった人は数知れないだろう。自分も SGD の本質がどこにあるのか分かっていなかったので改めて調べてみ…

マルコフ決定過程で脱出ゲーム

マルコフ決定過程と仲良くなりたい。一昨日書いた記事ではベルマン方程式の話をした。本を読んで理論を理解したつもりでも、自分で実装してみて初めて見える世界ってのもある。ってことで簡単なゲームを作って、マルコフ決定過程問題を解くアルゴリズムを実…

ベルマン方程式とは何か

今日はベルマン方程式について。強化学習を勉強していると最初の方に出てくるやつ。専門書を読みながら式変形を追うのに精いっぱいになっていると、いつの間にかその式がもつ意味を見失っちゃいますよね。 ってことで本記事では、細かい式変形は追わずに「ベ…

ロジスティック回帰とは何か

ロジスティック回帰って有名なわりにインターネット上の解説を見ていると定義にブレがあるように思う。なんだか紛らわしいので英語版 Wikipedia の Logistic regression のページをもとに整理してみる。その後なぜ紛らわしいのか整理しようと思う。ただし本…

【読書メモ】自然言語処理〔改訂版〕

いつも論文をメモってるけど今回は書籍を丸々メモる。自然言語処理(NLP)の技術ってソフトウェア工学研究でもよく目にするが、体系的に勉強したことないなぁと思って有名な入門書を読んでみた。ちなみに技術書を読むときは面白そうなところだけ読むので、読…

文法を網羅するファジング

論文投稿が終わってしばらく頭を休めていた。毎度のことながら論文書くのはしんどい。他人の成果物のあら探しをするのは簡単だが、いざ自分でアウトプットすると成果物を作り上げる行為のしんどさを思い出す。どんなことであれ自分でアウトプットする気概の…

記号実行によるプログラム等価性の検証

久しぶりの論文メモ。今回はプログラム解析のネタ。2 つのプログラムが機能的に同値であるかどうか判定する技術について。プログラムの静的解析は自分の専門だったので、たまに論文読むと里帰りの気分を味わえる。 タイトル ARDiff: Scaling Program Equival…

なぜベイズ推定にMCMCなのか?

MCMC (マルコフ連鎖モンテカルロ法) なにも分からん。ベイズ推定を勉強しているといつだって「計算が困難なので MCMC で事後分布を近似しよう!」という話に遭遇する。しかしながら MCMC が何を計算するものなのかよく分からないし、なにが嬉しいのかも分か…

Kotlin で Jupyter Notebook

Kotlin は素晴らしいプログラミング言語である。シンプルかつスマートな言語仕様、リッチな開発環境、ググれば出てくるノウハウ、どれをとっても使いやすい言語である。しかも JVM で動くので Write once, run anywhere 的な恩恵もある。個人的には、現代の…

PyTorch Tabular による表形式データの深層学習

ちょっくら機械学習ネタ。基本的に Python 書きたくないのでたまにしかやらない。 PyTorch Tabular とは 分類や回帰などの表形式データに対する機械学習には XGBoost, LightGBM などの勾配ブースティング手法が有効であることが知られている。一方で、近年に…

Docker コンテナの OS を確認する方法

いきなりまとめ ホストマシン上で次のコマンドを実行して出力されるメッセージを見る。 $ docker run --rm (調べたいDockerイメージ) sh -c "cat /etc/*-release" 背景 Dockerfile を書くときに RUN や CMD コマンドで叩ける命令はベースとしている OS イメ…

Docker ネットワークで遊ぶ

ソフトウェアエンジニアって物理現象を相手にするの嫌いですよね(偏見)。LAN ケーブル買ってきて断線とかしてたら最悪。ってことで今日は Docker network で仮想的なネットワークを作って遊んでみる。秋葉原で何も買ってこなくてよいので楽チン。 Docker n…

Rust 所有権とは何か

この記事では Rust 初心者向けに Rust の所有権の考え方を説明します。とはいっても、私自身 The Rust Programming Language の一部を読んで、Rust のコードを 1,000 行ほど書いた程度の理解度です。そのわりに「Rust の世界観を風船で表現しよう!」という…

A*アルゴリズムとは何か

かの有名な A* アルゴリズムについてのメモ。 ダイクストラ法と A*, weighted A*, anytime A* について。 ダイクストラ法と A* アルゴリズム A* アルゴリズムはグラフ上の最短経路を求めるアルゴリズムである。最短経路の素朴なアルゴリズムといえば ダイク…

【Z3ソルバー】関数の define と declare

Z3 ソルバーについてのメモ。 主なトピックは SMT-LIB の define と declare について。 Z3 と SMT-LIB Z3 は言わずと知れた SMT ソルバーである。オープンソースであり、Github のページにインストール手順も載っている。この手順の通りにやれば(少なくと…

「宿題を家に忘れました」で入門する統計的仮説検定

はじめに この記事では 宿題を家に忘れました を題材にして、統計的仮説検定について解説します。本記事の説明には以下の特長があります。 仮説検定の考え方や手順を初心者にもわかりやすく説明します。 仮説検定の説明にありがちな、確率分布を考慮した具体…

Finite Tree Automaton とは

最近、プログラム合成の研究で Finite Tree Automaton (FTA、有限木オートマトン) を使った手法がいくつか見られる。このオートマトンはプログラムの集合を簡素に表現するために用いられる。プログラムの集合を簡素に表現する手法として、ちょっと前までは V…

研究コミュニティ SyGuS について

今日はプログラム合成のコミュニティ SyGuS についての紹介。例によって日本で自分くらいしか興味がなさそうなトピック。そのうちきっと国内でも人気が高まるはず。。。 SyGuS とは SyGuS はプログラム合成についての有力な研究コミュニティである。プログラ…

ソフトウェアコンポーネントの挙動をモデリングする手法

明けましておめでとうございます。 年末年始にいろいろ論文読んだので簡単にメモしてゆく。 タイトル Modeling Black-Box Components with Probabilistic Synthesis GPCE 2020 [2010.04811] Modeling Black-Box Components with Probabilistic Synthesis htt…

記号実行とコンコリックテスト

記号実行(Symbolic Execution)とコンコリックテスト(Concolic Testing)は、プログラムの特定の箇所を通るような入力値を生成する手法であり、ソフトウェアテストに関する研究においてよく登場する。元々なんとなく理解していたつもりだが、もう少しちゃ…

Kotlin の require, check, assert 関数の使い分け

いきなりまとめ 関数 用途 require 関数の引数のチェックに使う。 check 関数の引数以外のチェックに使う。 assert どこに使ってもよい。実行時の VM 引数として -ea (-enableassertions) が必要。 背景 Kotlin には、引数として Boolean 型を取って、その引…

真面目に JavaScript のクロージャを解説する

いつも備忘録ばかり書いているので、たまには世の中の駆け出しプログラマの為になるような記事を書きたい。 クロージャみたいなちょっとややこしい概念って、その意味を調べようと思ってググってもあまりよい資料が見当たらない。技術的なトピックを理解する…

Datalog に入門する

とある論文がデータのスキーマ変換を行うために Datalog を用いていた。Prolog は触ったことあるし、Datalog って言葉も聞いたことはあったが、具体的にどんな言語で何が嬉しいのか知らなかったのでちょっと調べてみた。 ついでに Datalog のインプリタとし…

Spring Transaction Management: @Transactional In-Depth を読む Part 2

Part 1 のつづき。 元記事は以下。 www.marcobehler.com How Spring’s or Spring Boot’s Transaction Management works Spring のトランザクション管理や transaction abstraction framework は実際何をしているのか? JDBC では setAutocommit(false) がト…

Spring Transaction Management: @Transactional In-Depth を読む Part 1

トランザクション管理って難しい。 Spring を用いてトランザクション管理を解説している以下の記事がよさげだったので整理しながら読んでみる。 www.marcobehler.com この記事を読み終わるころには、Spring の @Transactional アノテーションがどのように動…

Kotlin で gRPC のチュートリアルをやってみた

REST はまぁ分かる。SOAP はなんとなく分かる。gRPC はまったく分からない。 ってことで gRPC について少し調べてみた。 gRPC について gRPC は 2015 年に Google によって公開された Remote Procedure Call (RPC) プロトコルである。RPC プロトコルなので l…

リストや木構造に対する再帰的な操作の合成

けっこう有名だけど、ちゃんと読んだことなかった論文。手法 というプログラム合成の手法。 タイトル Synthesizing Data Structure Transformations from Input-Output Examples PLDI2015 Synthesizing data structure transformations from input-output ex…

Go言語で標準出力を上書きする方法(プログレスバーなど)

コマンドラインツールを作るとき、進捗状況をリアルタイムで表示したい。 Ubuntu の例ではこういう感じ。 ソースコード 上記の Go 言語でのサンプルコードは以下の通り。 タイマーとか使うのが面倒だったので、適当に長めのループを回して、全体の p % に達…

論文:機械学習を用いたボトムアップなプログラム合成

タイトル BUSTLE: Bottom-up program-Synthesis Through Learning-guided Exploration arXiv, Submitted on 28 Jul 2020 [2007.14381] BUSTLE: Bottom-Up Program Synthesis Through Learning-Guided Exploration 手法の入出力 手法の入力 入出力例の集合 論…

論文:ウェブページからデータを抽出するプログラムの合成

プログラムを自動生成する研究、とくに入出力例を用いたプログラム合成 (Programming by Example) に興味があるので、論文を読んでメモとして残してゆく。以下、水色のテキストは私の主観的なコメント。 タイトル Web Data Extraction using Hybrid Program …