├── .gitignore ├── LICENSE ├── Makefile ├── README.md ├── main.pdf └── src └── main.tex /.gitignore: -------------------------------------------------------------------------------- 1 | ## Core latex/pdflatex auxiliary files: 2 | *.aux 3 | *.lof 4 | *.log 5 | *.lot 6 | *.fls 7 | *.out 8 | *.toc 9 | *.fmt 10 | *.fot 11 | *.cb 12 | *.cb2 13 | .*.lb 14 | 15 | ## Intermediate documents: 16 | *.dvi 17 | *.xdv 18 | *-converted-to.* 19 | # these rules might exclude image files for figures etc. 20 | # *.ps 21 | # *.eps 22 | # *.pdf 23 | 24 | ## Generated if empty string is given at "Please type another file name for output:" 25 | # .pdf 26 | 27 | ## Bibliography auxiliary files (bibtex/biblatex/biber): 28 | *.bbl 29 | *.bcf 30 | *.blg 31 | *-blx.aux 32 | *-blx.bib 33 | *.run.xml 34 | 35 | ## Build tool auxiliary files: 36 | *.fdb_latexmk 37 | *.synctex 38 | *.synctex(busy) 39 | *.synctex.gz 40 | *.synctex.gz(busy) 41 | *.pdfsync 42 | 43 | ## Build tool directories for auxiliary files 44 | # latexrun 45 | latex.out/ 46 | 47 | ## Auxiliary and intermediate files from other packages: 48 | # algorithms 49 | *.alg 50 | *.loa 51 | 52 | # achemso 53 | acs-*.bib 54 | 55 | # amsthm 56 | *.thm 57 | 58 | # beamer 59 | *.nav 60 | *.pre 61 | *.snm 62 | *.vrb 63 | 64 | # changes 65 | *.soc 66 | 67 | # comment 68 | *.cut 69 | 70 | # cprotect 71 | *.cpt 72 | 73 | # elsarticle (documentclass of Elsevier journals) 74 | *.spl 75 | 76 | # endnotes 77 | *.ent 78 | 79 | # fixme 80 | *.lox 81 | 82 | # feynmf/feynmp 83 | *.mf 84 | *.mp 85 | *.t[1-9] 86 | *.t[1-9][0-9] 87 | *.tfm 88 | 89 | #(r)(e)ledmac/(r)(e)ledpar 90 | *.end 91 | *.?end 92 | *.[1-9] 93 | *.[1-9][0-9] 94 | *.[1-9][0-9][0-9] 95 | *.[1-9]R 96 | *.[1-9][0-9]R 97 | *.[1-9][0-9][0-9]R 98 | *.eledsec[1-9] 99 | *.eledsec[1-9]R 100 | *.eledsec[1-9][0-9] 101 | *.eledsec[1-9][0-9]R 102 | *.eledsec[1-9][0-9][0-9] 103 | *.eledsec[1-9][0-9][0-9]R 104 | 105 | # glossaries 106 | *.acn 107 | *.acr 108 | *.glg 109 | *.glo 110 | *.gls 111 | *.glsdefs 112 | *.lzo 113 | *.lzs 114 | 115 | # uncomment this for glossaries-extra (will ignore makeindex's style files!) 116 | # *.ist 117 | 118 | # gnuplottex 119 | *-gnuplottex-* 120 | 121 | # gregoriotex 122 | *.gaux 123 | *.gtex 124 | 125 | # htlatex 126 | *.4ct 127 | *.4tc 128 | *.idv 129 | *.lg 130 | *.trc 131 | *.xref 132 | 133 | # hyperref 134 | *.brf 135 | 136 | # knitr 137 | *-concordance.tex 138 | # TODO Comment the next line if you want to keep your tikz graphics files 139 | *.tikz 140 | *-tikzDictionary 141 | 142 | # listings 143 | *.lol 144 | 145 | # luatexja-ruby 146 | *.ltjruby 147 | 148 | # makeidx 149 | *.idx 150 | *.ilg 151 | *.ind 152 | 153 | # minitoc 154 | *.maf 155 | *.mlf 156 | *.mlt 157 | *.mtc[0-9]* 158 | *.slf[0-9]* 159 | *.slt[0-9]* 160 | *.stc[0-9]* 161 | 162 | # minted 163 | _minted* 164 | *.pyg 165 | 166 | # morewrites 167 | *.mw 168 | 169 | # nomencl 170 | *.nlg 171 | *.nlo 172 | *.nls 173 | 174 | # pax 175 | *.pax 176 | 177 | # pdfpcnotes 178 | *.pdfpc 179 | 180 | # sagetex 181 | *.sagetex.sage 182 | *.sagetex.py 183 | *.sagetex.scmd 184 | 185 | # scrwfile 186 | *.wrt 187 | 188 | # sympy 189 | *.sout 190 | *.sympy 191 | sympy-plots-for-*.tex/ 192 | 193 | # pdfcomment 194 | *.upa 195 | *.upb 196 | 197 | # pythontex 198 | *.pytxcode 199 | pythontex-files-*/ 200 | 201 | # tcolorbox 202 | *.listing 203 | 204 | # thmtools 205 | *.loe 206 | 207 | # TikZ & PGF 208 | *.dpth 209 | *.md5 210 | *.auxlock 211 | 212 | # todonotes 213 | *.tdo 214 | 215 | # vhistory 216 | *.hst 217 | *.ver 218 | 219 | # easy-todo 220 | *.lod 221 | 222 | # xcolor 223 | *.xcp 224 | 225 | # xmpincl 226 | *.xmpi 227 | 228 | # xindy 229 | *.xdy 230 | 231 | # xypic precompiled matrices and outlines 232 | *.xyc 233 | *.xyd 234 | 235 | # endfloat 236 | *.ttt 237 | *.fff 238 | 239 | # Latexian 240 | TSWLatexianTemp* 241 | 242 | ## Editors: 243 | # WinEdt 244 | *.bak 245 | *.sav 246 | 247 | # Texpad 248 | .texpadtmp 249 | 250 | # LyX 251 | *.lyx~ 252 | 253 | # Kile 254 | *.backup 255 | 256 | # gummi 257 | .*.swp 258 | 259 | # KBibTeX 260 | *~[0-9]* 261 | 262 | # TeXnicCenter 263 | *.tps 264 | 265 | # auto folder when using emacs and auctex 266 | ./auto/* 267 | *.el 268 | 269 | # expex forward references with \gathertags 270 | *-tags.tex 271 | 272 | # standalone packages 273 | *.sta 274 | 275 | # Makeindex log files 276 | *.lpz 277 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Yusuke Matsui 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: all build clean clean_all 2 | 3 | all: clean build 4 | 5 | # -shell-escape is required for minted 6 | build: 7 | uplatex -shell-escape ./src/main.tex 8 | uplatex -shell-escape ./src/main.tex 9 | dvipdfmx main.dvi -o main.pdf 10 | 11 | clean: 12 | rm -rf *.dvi *.log *.aux *.out _minted* 13 | 14 | clean_all: clean 15 | rm -rf main.pdf 16 | 17 | 18 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 工学系の卒論生のための数式記述入門 2 | 3 | 本資料は、初めて技術文章を書く工学系卒論生向けの、数式記述の入門書です。 4 | 自分のアイデアを式として記述する作業は難しく、最初のうちはうまく書けません。 5 | 本資料は、そんな学生向けに、数式をどう記述すればいいかのガイドラインを示します。 6 | 7 | ## 資料本体 8 | - [pdf](https://github.com/mti-lab/math_writing/raw/main/main.pdf) 9 | 10 | ## 作者 11 | - [松井勇佑](http://yusukematsui.me/index_jp.html) 12 | 13 | ## ビルド方法 14 | 検証環境:Windows 11 + WSL2 + Ubuntu 20.04 15 | ```console 16 | $ sudo apt install texlive-full fonts-noto 17 | $ git clone https://github.com/mti-lab/math_writing.git 18 | $ cd math_writing 19 | $ make build 20 | ``` 21 | -------------------------------------------------------------------------------- /main.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mti-lab/math_writing/12b9e7595df0e2f9d870c90a2892f252e041fba3/main.pdf -------------------------------------------------------------------------------- /src/main.tex: -------------------------------------------------------------------------------- 1 | \RequirePackage{plautopatch} % From https://qiita.com/wtsnjp/items/76557b1598445a1fc9da 2 | 3 | \documentclass[uplatex,twocolumn,9pt,dvipdfmx]{jsarticle} 4 | 5 | \usepackage[dvipdfmx]{hyperref} 6 | 7 | % To fix garbled text in the table of contents 8 | \usepackage{pxjahyper} 9 | 10 | % Change the link style 11 | % https://tex.stackexchange.com/questions/823/remove-ugly-borders-around-clickable-cross-references-and-hyperlinks 12 | \hypersetup{ 13 | colorlinks = true, % Colours links instead of ugly boxes 14 | urlcolor = blue, % Colour for external hyperlinks 15 | linkcolor = blue, % Colour of internal links 16 | citecolor = red % Colour of citations 17 | } 18 | 19 | \usepackage[left=1.5cm, right=1.5cm, top=2cm, bottom=3cm]{geometry} 20 | 21 | % Beautiful Japanese font % 22 | % Install noto fonts by $ sudo apt install fonts-noto 23 | % You need to use uplatex. 24 | \usepackage[deluxe]{otf} 25 | \usepackage[noto-otc]{pxchfon} 26 | 27 | % For beautiful source-code 28 | % https://www.overleaf.com/learn/latex/Code_Highlighting_with_minted 29 | \usepackage{minted} 30 | 31 | % For text box (screen) 32 | \usepackage{ascmac} 33 | 34 | % For math stuff 35 | \usepackage{amsmath} 36 | \usepackage{amsfonts} 37 | \usepackage{bm} 38 | 39 | % For a beautiful table 40 | \usepackage{booktabs} 41 | 42 | % Alias 43 | \newcommand{\Tref}[1]{表\ref{#1}} 44 | \newcommand{\Eref}[1]{式\ref{#1}} 45 | \newcommand{\Fref}[1]{図\ref{#1}} 46 | \newcommand{\Aref}[1]{アルゴリズム\ref{#1}} 47 | \newcommand{\Sref}[1]{\ref{#1}章} 48 | 49 | \newcommand{\todo}[1]{\textbf{\textcolor{cyan}{[\textsc{TODO:} #1]}}} 50 | 51 | \begin{document} 52 | 53 | \title{工学系の卒論生のための数式記述入門} 54 | \author{東京大学 情報理工学系研究科 講師 松井勇佑} 55 | \date{初版 2021年1月7日 / 最終更新 2023年4月26日} 56 | \maketitle 57 | 58 | \begin{screen} 59 | \begin{itemize} 60 | \item 本資料のGitHubリポジトリ: \url{https://github.com/mti-lab/math_writing} 61 | \item 著者のウェブページ:\url{http://yusukematsui.me} 62 | \end{itemize} 63 | \end{screen} 64 | 65 | \section{はじめに} 66 | 67 | 本資料は、初めて技術文章を書く学生向けの、数式記述の入門書です。 68 | 自分のアイデアを式として記述する作業は難しく、最初のうちはうまく書けません。 69 | 本資料は、そんな学生向けに、数式をどう記述すればいいかのガイドラインを示します。 70 | 特に、よくありがちな、\textbf{変数がゴチャゴチャしてわかりにくく} 71 | なったり、\textbf{アルファベットを使いすぎて足りなくなったり}する状況の改善を目指します。 72 | 73 | 重要なことは次の三点です。 74 | \begin{itemize} 75 | \item 伝えたいことを間違えることなく正確に記述すること 76 | \item 複雑すぎず、しかし曖昧でもない、必要十分な記述とすること 77 | \item 10年後に読まれても理解できる記述にすること 78 | \end{itemize} 79 | まず、式を間違えると読者が混乱します。そして、間違えた式に基づいた議論は間違いです。なので、 80 | 正確な記述をしましょう。次に、式が複雑すぎたり曖昧だと読者が混乱します。 81 | 複雑すぎる式は訓練で簡潔に出来ます。本記事はそのための指南書です。 82 | 最後に、未来の読者でも理解できる記述にしましょう。なぜなら、研究とは知識を積み重ねる 83 | 「時代を超えた共同作業」だからです。numpyのブロードキャストを前提とする記法のような、 84 | 現在使われているライブラリを知らないと理解できない記述はやめましょう。 85 | 86 | 87 | 本資料は読者として工学系の卒論生を想定しています。 88 | 特に、筆者の専門である情報工学、そのなかでもコンピュータビジョン・画像処理分野の学生を 89 | 主たる対象としています\footnote{ 90 | ディープラーニング時代の画像処理分野の論文中には 91 | 何も考えずにnumpy表記をコピーしただけの間違った数式があまりにも多いです。 92 | 私はそういう論文を査読する際「もうちょっとしっかりしてくれよ」と常々思っていました。 93 | これからの学生にはそのような間違いを犯してほしくないので、この文章を書くことにしました}。 94 | \textbf{分野が違うと慣習も大きく違う}ので注意してください。 95 | 本資料の内容と普段読んでいる論文の記述に矛盾があった場合は、常に自分の分野の慣習を優先してください。 96 | また、コメントなど歓迎です。\href{https://github.com/mti-lab/math_writing/issues}{issue}へ書き込むか、 97 | \href{https://github.com/mti-lab/math_writing/pulls}{pull request}をお願いします。 98 | 99 | 100 | 101 | 102 | 103 | 104 | \subsection{参考資料} 105 | まず、数式の記述を考える前に、アカデミックライティングの基本を前提知識として勉強しておきましょう。 106 | 以下が必読でので読んでおきましょう。 107 | \begin{itemize} 108 | \item \href{https://www.amazon.co.jp/dp/4121006240}{木下是雄、理科系の作文技術}:アカデミックライティングに関する古典的な名著です。薄い新書なので、とりあえず読みましょう。 109 | \item 東京大学松尾先生による記事:読み物としても面白い、松尾先生による論文執筆指南です。短い文章で重要な事項が凝縮されており、必読です。 110 | \begin{itemize} 111 | \item \href{http://ymatsuo.com/japanese/ronbun_jpn.html}{松尾ぐみの論文の書き方} 112 | \item \href{http://ymatsuo.com/japanese/ronbun_eng.html}{松尾ぐみの論文の書き方:英語論文} 113 | \end{itemize} 114 | \end{itemize} 115 | 116 | 次に、数式の表記(notation)に関して参考になる資料を紹介します。 117 | 本記事では、これらを参考に、松井の考えるnotationのベストプラクティスを紹介します。 118 | \begin{itemize} 119 | \item \href{https://www.amazon.co.jp/dp/4621061453}{D. A. ハーヴィル、統計のための行列代数 上下}:これは線形代数の辞書です。表記はもとより、導出がわからない式に出会った場合に参考になります。 120 | \item \href{https://www.amazon.co.jp/dp/1421407949}{Golubら、Matrix Computations}:これは実際に計算することを念頭においた、線形代数の教科書です。こちらも、辞書として使えます。 121 | \item \href{http://www2.imm.dtu.dk/pubdb/pubs/3274-full.html}{Petersonら、The Matrix Cookbook}:これは線形代数の公式のクックブックです。無料のpdfとして公開されており、簡単に調べたいときはこれが参考になります。 122 | \item \href{https://www.deeplearningbook.org/contents/notation.html}{GoodfellowらのDeep Learningのnotationページ}:Deep Learningに関する教科書のnotationの部分が無料で公開されています。画像処理分野の表記方法として参考になります。 123 | \item \href{https://speakerdeck.com/yokotatsuya/tensorufen-jie-falseji-chu-toying-yong-miru2022tiyutoriaru}{名工大横田先生による「テンソル分解の基礎と応用(MIRU2022 チュートリアル)」}:行列を一般化した「テンソル」に関する、 124 | 日本語での包括的な資料です。p78以降に、テンソル表記に関する詳細なまとめがあります。 125 | \item \href{https://arxiv.org/abs/2207.09238/}{Phuongら、Formal Algorithms for Transformers}:Transformerを題材に、複雑な構造をどのように数式として厳密に書くか示したものです。具体的であり、参考になります。特に、文字列といった「長さが文脈に依存する系列」についての記述についてはぜひこの資料を参考にしてください。 126 | \end{itemize} 127 | 128 | また、TeXに関しては、ネット上の資料が古かったり、現代的なベストプラクティスがわからないことが多々あります。次の資料が参考になります。 129 | \begin{itemize} 130 | \item \href{https://www.overleaf.com/learn/latex/Main_Page}{OverleafのTeX入門ページ}:現代的な記述がまとまっているので、辞書として使えます。 131 | \item \href{https://github.com/akira-okumura/MasterThesisTemplate}{修士論文 LaTeX テンプレート|名古屋大学宇宙地球環境研究所の理学系修士学生用}:名大の奥村先生による、修論生向けのLaTeXテンプレートです。TeXについて知っておくべき基本的で現代的な事項が多く含まれています。 132 | \end{itemize} 133 | 134 | 135 | 136 | \subsection{アルファベットが足りなくなるとは} 137 | 本記事ではよく「アルファベットが足りなくなる」とか、「アルファベットを消費しないために」といった 138 | 表現をします。これは、論文中で変数や定数にアルファベットを使っていくうちに、 139 | 自然に使えるアルファベットを使い切ってしまう状況を意味します。 140 | 「たいしたことを言っていないのに何故かアルファベットが全然足りない」という状況は 141 | 多くの人が一度は経験すると思います。 142 | 本記事では、それを防ぐ様々な方法を紹介します。 143 | 144 | 145 | 146 | 147 | 148 | 149 | \section{変数と定数の表記} 150 | 変数・定数の表記をしっかり行うことは極めて重要です。 151 | 表記がしっかりしていないと、読者は混乱します。 152 | 逆に、表記がしっかりしていれば、それだけで読みやすく 153 | 意図が伝わりやすい記述になります。ブレない表記を目指しましょう。 154 | 155 | 変数や定数の表記は分野によって慣習が大きく違います。 156 | まずは自分の分野の慣習を理解し、それに従ってください。 157 | 重要なのは\textbf{統一する}ことです。例えば本文中でベクトルは太字で書くと決めたら、 158 | そのルールをずっと守ってください。表記のルールが統一されていない文章は、 159 | 不明瞭で誤解を招きます。 160 | 161 | 162 | \subsection{まずはじめに:実数や自然数} 163 | まずはじめに、黒板太字(\mintinline{tex}{\mathbb})を考えましょう。 164 | 黒板文字は、いくつかの慣習的な表記で用います。 165 | 実数全体を表す$\mathbb{R}$、整数全体を表す$\mathbb{Z}$、 166 | 自然数全体を表す$\mathbb{N}$などです。 167 | 他の例は\href{https://en.wikipedia.org/wiki/Blackboard_bold}{wikipedia等}を参照してください。 168 | ときどき黒板太字を普通のベクトルに使う論文を見ますが、 169 | 黒板太字は上記のような慣用表記のみに使うことをオススメします。 170 | なぜなら、上記のような慣用表記に黒板太字を使うことが慣習である以上、 171 | その表記をベクトルという別概念に使うことは混乱を招くからです。 172 | 173 | ちなみに、パワーポイントで黒板太字を用いるには、数式機能で 174 | \mintinline{tex}{\doubleR}とします。これはTeXにおける 175 | \mintinline{tex}{\mathbb{R}}と同じ表記になります。 176 | 177 | さて、黒板文字を理解したうえで、 178 | 画像処理分野でのオススメ表記ルールを\Tref{tbl:hensu}にまとめました。 179 | これらについて一つ一つ見ていきましょう。 180 | 181 | 182 | \begin{table*} 183 | \centering 184 | \begin{tabular}{@{}llll@{}} \toprule 185 | 型 & 表記 & ドメインの例 & 値の例 \\ \midrule 186 | スカラー & 小文字か大文字。何もつけない。 & $a \in \mathbb{R}$.~~$b \in \mathbb{N}$.~~$K \in \{10, 20, 30\}$. & $a = 3.2$.~~$b = 13$.~~$K=20$. \\ 187 | ベクトル & 小文字で太字(\mintinline{tex}{\mathbf}か\mintinline{tex}{\bm}) & $\mathbf{x} \in \mathbb{R}^3$.~~$\bm{x} \in \mathbb{R}^D$.~~$\mathbf{b} \in \{0, 1\}^B$. & $\mathbf{x} = [0.1, 0.2, 0.3]^\top$. $\mathbf{b} = [0, 1, 1, 0, 1]^\top$.\\ 188 | 行列 {\tiny(および三階以上のテンソル)} & 大文字で太字(\mintinline{tex}{\mathbf}か\mintinline{tex}{\bm}) & $\mathbf{A} \in \mathbb{R}^{2 \times 3}$.~~$\mathbf{I} \in [0, 1]^{H \times W \times 3}$. & $\mathbf{A} = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix}$. \\ 189 | 集合 & 大文字でカリグラフィ(\mintinline{tex}{\mathcal}) & $\mathcal{S} \subset \mathbb{N}$. & $\mathcal{S} = \{2, 4, 8, 16 \}$. \\ 190 | \bottomrule 191 | \end{tabular} 192 | \caption{変数・定数の表記} 193 | \label{tbl:hensu} 194 | \end{table*} 195 | 196 | 197 | 198 | \subsection{スカラー} 199 | まずはじめにスカラー値です。これ何も装飾せずに、小文字あるいは大文字を使う 200 | ことをオススメします。 201 | ここで、ドメインを明記するとわかりやすくなります。 202 | ドメインとは、その値が定義される範囲です。 203 | たとえば 204 | 「ここで、重み$w \in \mathbb{R}$を考えます」 205 | というような形です。これにより、$w$は実数であることが 206 | 明示できます。いくつかの離散値の中からどれか一つを値として取る場合は、 207 | 集合の要素を示す「$\in$」、および集合そのものを表記します。例えば次のような形です。 208 | 「ここで、係数$\alpha$は三通りの値のいずれかを取ります。:$\alpha \in \{0.1, 0.5, 1.0\}$」 209 | 210 | ここで、\href{https://en.wikipedia.org/wiki/Interval_(mathematics)}{区間}を示すカッコの使い方を復習しておきましょう。 211 | これらは大学入試で習っていると思うのですが、いざ自分で数式を書こうと思うと 212 | なかなか正確に書きづらいようです。 213 | \begin{itemize} 214 | \item $a \in [2, 7]$: $a$は2以上7以下の実数 215 | \item $a \in (2, 7)$: $a$は2より大きく7より小さい実数 216 | \item $a \in [2, 7)$: $a$は2以上で7より小さい実数 217 | \item $a \in \{2, 7\}$: $a$は2か7 218 | \item $a \in \{2, \dots, 7\}$: 自然に解釈すれば$a$は2か3か4か5か6か7。しかし文脈から別の意味にとられることもある。整数列挙であることを強調するなら$\{2, 3, \dots, 7\}$としてもいい。 219 | \end{itemize} 220 | 最後の例は必ずしも整数列挙だけではない点に注意しましょう。 221 | 例えば「2以上10以下の2の倍数の集合$\mathcal{N}=\{2, \dots, 10\}$を考える」 222 | と明示的に述べた場合、$\mathcal{N}$は$\{2, 4, 6, 8, 10\}$と理解するほうが自然であり、 223 | $\{2, 3, 4, 5, 6, 7, 8, 9, 10\}$とは取られないと思います。 224 | 225 | \subsection{ベクトル} 226 | 次にベクトルです。 227 | これは、\textbf{小文字で太字} 228 | (\mintinline{tex}{\mathbf}か\mintinline{tex}{\bm}) 229 | にすることをオススメします。 230 | ベクトルを太字にしない流派はいくらでもあります。 231 | しかし、太字にすると心に決めて全て統一するほうが 232 | 読みやすいというのが私の考えです。 233 | 「これはいちいちベクトルだと主張しないでも自明だろう」と著者で思ったとしても、 234 | 読者側からすると全く自明ではないケースがいくらでもあるように思います。 235 | 後述するように行列には大文字を使うことをオススメしますので、 236 | ベクトルは小文字で統一するほうがわかりやすいと思います。 237 | 238 | 重要なことは、意図的に隠したい場合を除き、 239 | \textbf{常にドメインを明示すること}です。 240 | すなわち、 241 | \begin{itemize} 242 | \item $D$次元の入力ベクトル$\mathbf{x}$を考える 243 | \end{itemize} 244 | ではなく、 245 | \begin{itemize} 246 | \item $D$次元の入力ベクトル$\mathbf{x}\in\mathbb{R}^D$を考える 247 | \end{itemize} 248 | としましょう。ベクトルがいったい何なのかということは、 249 | 著者が思っているよりもずっと、読者に伝わりづらいです。 250 | ドメインを明示することでずっとわかりやすくなります。 251 | また、上記からわかるように、実質的な記述量の増加は 252 | 「$\in\mathbb{R}^D$」だけなので、記述が増えて 253 | 困るということもありません。 254 | 特殊な理由がある場合を除き、 255 | 全てのベクトルに関して、初めて登場するときに 256 | 必ずドメインを明示することをオススメします。 257 | 258 | \mintinline{tex}{\mathbf}と\mintinline{tex}{\bm}のどちらを使うかは、ケースバイケースです。 259 | \begin{itemize} 260 | \item 太字なし: $x$, $a$, $1$, $\mu$ 261 | \item \mintinline{tex}{\mathbf}の例: $\mathbf{x}$, $\mathbf{a}$, $\mathbf{1}$, $\mathbf{\mu}$ 262 | \item \mintinline{tex}{\bm}の例: $\bm{x}$, $\bm{a}$, $\bm{1}$, $\bm{\mu}$ 263 | \end{itemize} 264 | 上からわかるように、\mintinline{tex}{\mathbf}のほうが、標準文字と違った書体(非イタリック)になります。 265 | \mintinline{tex}{\bm}のほうは、標準文字をそのまま太くしたような書体(イタリックのまま)です。 266 | ここで使われる具体的なフォントは論文のフォーマットによって変わるので注意してください。 267 | $\mu$のような特殊文字は\mintinline{tex}{\mathbf}で太字にならない(非イタリックにならない)ので、 268 | そういう特殊文字のベクトルを多用する場合は\mintinline{tex}{\bm}でそろえるほうが綺麗だと思います。 269 | 一方で、\mintinline{tex}{\bm}は太字に見えづらい面もあります。 270 | すわなち、pdfビューアの種類、ディスプレイのサイズ、紙面への印刷具合などで、太字ではなく通常文字に見えることがあります。 271 | なので、太字であることを強調するためにあえて\mintinline{tex}{\mathbf}にするパターンもあります。 272 | 実際に執筆する論文のフォーマット上で両方を表示して比較して決めるとよいと思います。 273 | 私は最近はCVPRフォーマットでは\mintinline{tex}{\mathbf}を使うようにしています。 274 | ちなみに、パワーポイントで太字を表現したいときは、 275 | 文字を選択して太字にすることで表現できます。 276 | 277 | また、ベクトルは、断りが無い限り「縦(列)ベクトル」である、と心に決めるとよいです。 278 | その場合、数字を横にならべて値を表現する場合は転置する必要があることに注意してください。 279 | \begin{itemize} 280 | \item $\mathbf{x} = [1, 2, 3]^\top$ : 縦ベクトル。OK 281 | \item $\mathbf{x} = [1, 2, 3]$ : 横ベクトル。明示的に横ベクトルを作るとき以外、この表記は使わない 282 | \end{itemize} 283 | 転置がないと「横(行)ベクトル」になってしまいますね。ちなみに 284 | 転置記号としては「$T$」を使う人が多いですが、 285 | 上式のように、TeXで用意されている\mintinline{tex}{\top}を使うと綺麗です。 286 | このように縦か横かにこだわる理由は、行列演算を行う際に注意が必要だからです。 287 | すなわち、$\mathbf{x} \in \mathbb{R}^2$が縦ベクトルであるときは 288 | 行列$\mathbf{A} \in \mathbb{R}^{2 \times 2}$に対し$\mathbf{A}\mathbf{x}$が 289 | 計算できますが、$\mathbf{x} \in \mathbb{R}^2$が横ベクトルであるときは計算できません。 290 | このあたりを厳密にするために、「特に断らなければベクトルは縦ベクトル」と心に決めて 291 | 記述すると良いです。 292 | 293 | より厳密に言うと、$\mathbb{R}^D$の表記だけでは横か縦かは定義されていません。 294 | なので、$\mathbb{R}^D$を、列ベクトルであることを明示する$\mathbb{R}^{D \times 1}$の 295 | 省略表記であると考えるとスッキリすると思います。 296 | \begin{itemize} 297 | \item $\mathbf{a} \in \mathbb{R}^D$: この表記の場合、縦ベクトルだと心に決める。これは$\mathbb{R}^{D \times 1}$の省略版だとも解釈できる 298 | \item $\mathbf{b} \in \mathbb{R}^{D \times 1}$: 縦ベクトルであると明示する場合 299 | \item $\mathbf{c} \in \mathbb{R}^{1 \times D}$: 横ベクトルであると明示する場合 300 | \end{itemize} 301 | このあたりは画像処理分野の慣習かもしれません。 302 | いずれにせよ、\textbf{表記の矛盾を無くし、表記を統一する}ことが重要です。 303 | 304 | 305 | \subsection{行列、および三階以上のテンソル} 306 | 次に行列、および三階以上のテンソルです。三階以上のテンソルというのは、 307 | $\mathbf{A} \in \mathbb{R}^{5\times 5 \times 5}$ のように 308 | 行列を一般化したものです。このような表記は画像分野では多用します。 309 | なぜなら、そもそも画像そのものを 310 | 正確に記述しようとするとそのような表記になるからです。すなわち、 311 | 縦$H$横$W$の3チャンネル(RGB)画像$\mathbf{I}$は 312 | $\mathbf{I} \in \mathbb{R}^{H \times W \times 3}$のように書けます\footnote{ 313 | ちなみにここでは$\mathbb{R}^{3 \times H \times W}$のようにチャンネル情報を前にしてももちろんOKです。 314 | あるいは、$H$と$W$を入れ替えてもいいです。}。 315 | また、近年のディープラーニングに関する議論では、処理中に出てくる重み情報を、 316 | 上記のように階数が大きいテンソルとして表現することが多いです。 317 | テンソルに関しては名工大横田先生の資料\footnote{\url{https://speakerdeck.com/yokotatsuya/tensorufen-jie-falseji-chu-toying-yong-miru2022tiyutoriaru}}をご参照ください。 318 | 319 | さて、これらは、基本的に\textbf{大文字で太字}にすることをオススメします。 320 | 行列は太字にしないほうが一般的かもしれません。 321 | しかし、私は太字にすることをオススメします。というのも、太字にしない場合はスカラーと混合される可能性が残るからです。 322 | なので、情報が複数含まれるもの(ベクトルや行列)は太字にする、と決めるほうがスッキリすると思います。 323 | 324 | ちなみに、例えばGoodfellowらの「Deep Learning」では三階以上のテンソルに 325 | \mintinline{tex}{\mathsf}を割り当てています\footnote{\url{https://www.deeplearningbook.org/contents/notation.html}}。 326 | もし、三階以上のテンソルを多用したり、行列と区別をもたせることが重要な場合は、 327 | そのように別の書式を割り振るほうが良い場面もあると思います。 328 | 329 | 330 | さて、それではいくつか例を見てみましょう。 331 | \begin{itemize} 332 | \item $a \in \mathbb{R}$: 実数のスカラー 333 | \item $\mathbf{a} \in \mathbb{R}^2$: 実数2つを並べたベクトル 334 | \item $\mathbf{A} \in \mathbb{R}^{2 \times 3}$: 実数が$2\times3$個並んだ行列 335 | \item $\mathbf{B} \in [0, 1]^{2 \times 3}$: 要素が全て0以上1以下である、$2\times3$の行列 336 | \item $\mathbf{C} \in [0, 1)^{2 \times 3 \times 4}$: 要素が全て0以上1未満である、$2\times 3 \times 4$のテンソル 337 | \item $\mathbf{D} \in \{-1, 0, 1\}^{2 \times 3}$: 要素が全て「-1, 0, 1」の何れかである、$2\times3$の行列 338 | \item $\mathbf{E} \in \{0, \dots, 100\}^{2 \times 3}$: 要素が全て「$0, 1, \dots, 100$」の何れかである、$2\times3$の行列 339 | \item $\mathbf{f} \in \mathbb{N}^{1 \times ab}$: 要素が自然数で、幅が$ab$の横ベクトル 340 | \item $\mathbf{F} \in \mathbb{N}^{a \times b}$: 要素が自然数で、$a\times b$の行列 341 | \end{itemize} 342 | 343 | \subsection{集合} 344 | 最後に集合です。集合は大文字でカリグラフィ(\mintinline{tex}{\mathcal}) 345 | にするといいでしょう。例えば$D$次元のベクトル$N$本の集合であるデータセット$\mathcal{X}$を考えると、これは 346 | $\mathcal{X} = \{ \mathbf{x}_1, \mathbf{x}_2, \dots, \mathbf{x}_N \}$、あるいは 347 | $\mathcal{X} = \{ \mathbf{x}_n \}_{n=1}^N$ のように書けます。ここで 348 | $\mathcal{X} \subset \mathbb{R}^D$であり、$\mathbf{x}_n \in \mathbb{R}^D$です。 349 | 「集合の部分集合」を示すには「$\subset$」あるいは「$\subseteq$」を使い、 350 | 「集合の要素」を表すには「$\in$」を使う、という点を混乱しないようにしましょう。 351 | ここでは、$\mathbf{x}_n \in \mathcal{X}$でもあります。 352 | また、集合の要素数を表すには$|\mathcal{X}|$とします。ここでは$|\mathcal{X}|=N$ですね。 353 | 354 | ちなみに、集合というと普通は重複を含みません。重複を含むものは多重集合:multisetと言います。 355 | なので、上記のようにデータセットを定義すると、データセット中に重複するベクトルがあるときに 356 | 扱いに困る($|\mathcal{X}| \ne N$になる)はずなのですが、画像処理の分野ではこのあたりが 357 | 厳密に扱われないようです。 358 | 359 | パワーポイント中で集合を表現するには、数式機能中で\mintinline{tex}{\scriptS}のようにします。 360 | これはTeX中の\mintinline{tex}{\mathcal{S}}に対応します。 361 | 362 | 363 | \subsection{例} 364 | 365 | 上記のルールを厳密に守ると、人工的な例ですが例えば以下のように「c」というアルファベット一字で 366 | 様々なものを表現することができます。 367 | 368 | \begin{screen} 369 | k-meansクラスタリングにより作られた$C$本の$D$次元ベクトル(中心ベクトル)を、次のように表記する。 370 | \begin{equation} 371 | \mathcal{C} = \{\mathbf{c}_1, \dots, \mathbf{c}_C \} \subset \mathbb{R}^D. 372 | \end{equation} 373 | ここで、$\mathbf{c}_i \in \mathbb{R}^D$は$i$番目の中心ベクトルをを指し、$\mathcal{C}$は$C$本の 374 | 中心ベクトルを集めた集合である。 375 | また、各ベクトルを横に並べて作った$D \times C$の行列を次のように定義する。 376 | \begin{equation} 377 | \mathbf{C} = [\mathbf{c}_1 \mid \mathbf{c}_2 \mid \dots \mid \mathbf{c}_C] \in \mathbb{R}^{D \times C}. 378 | \end{equation} 379 | \end{screen} 380 | 381 | 上の例では$C$と$\mathcal{C}$が区別しづらいのでちょっとやりすぎですが、$C$を例えば$K$にすれば十分に見やすいです。 382 | 上のように\mintinline{tex}{\mathcal}でベクトルの集合を作り、それを並べた行列は 383 | 同じアルファベットを\mintinline{tex}{\mathbf}したものにする、という表記は、 384 | 使うアルファベットを減らしつつ関係性を示せる小ネタです。 385 | 386 | \section{関数の入出力の表記} 387 | 388 | 関数を定義するとき、その入力と出力も明示するとわかりやすい場面が多々あります。 389 | このとき、(1) 入力の集合と出力の集合を明記、(2) 入力の要素と出力の要素を明記、 390 | とする二通りの形式があります。場面に応じて使い分けると良いでしょう。 391 | 392 | \subsection{関数の入出力の表記の例} 393 | 例えば、$x \in \mathbb{R}$に関する関数$f(x) = x^2$を考えます。 394 | この入出力を集合を用いて表記すると次のようになります。 395 | \begin{equation} 396 | f: \mathbb{R} \to \mathbb{R}. 397 | \end{equation} 398 | これを要素で表記すると次のようになります。 399 | \begin{equation} 400 | f: x \mapsto x^2. 401 | \end{equation} 402 | 要素で表記するときは\mintinline{tex}{\mapsto}を使う点に注意してください。 403 | 404 | 多変数の例を見てみましょう。また、出力変数も考えてみます。 405 | ここで、$x$と$y$に関する関数$f(x, y) = z = x^2 + y + 1$は次のように書けます。 406 | 集合で表記: 407 | \begin{equation} 408 | f: \mathbb{R} \times \mathbb{R} \to \mathbb{R}. 409 | \end{equation} 410 | 要素で表記: 411 | \begin{equation} 412 | f: (x, y) \mapsto z. 413 | \end{equation} 414 | $f: (x, y) \mapsto x^2 + y + 1$のように全て書くほうがスッキリする 415 | 場合もあると思います。 416 | 417 | ベクトルの例も見てみましょう。 418 | 定数ベクトル$\mathbf{a} \in \mathbb{R}^D$ および定数のスカラー値 $b \in \mathbb{R}$があるとします。 419 | ここで変数$\mathbf{x} \in \mathbb{R}^D$に関する関数$f(\mathbf{x}) = \mathbf{a}^\top \mathbf{x} + b$は 420 | 次のように書けます。 421 | 集合で表記: 422 | \begin{equation} 423 | f: \mathbb{R}^D \to \mathbb{R}. 424 | \end{equation} 425 | 要素で表記: 426 | \begin{equation} 427 | f: \mathbf{x} \mapsto \mathbf{a}^\top \mathbf{x} + b. 428 | \end{equation} 429 | 430 | 入力も出力もベクトルの例も見てみましょう。 431 | $\mathbf{x} = [x_1, x_2]^\top \in \mathbb{R}^2$ 432 | とします。ここで 433 | 3要素を返す関数$f(\mathbf{x})$を要素表記で見てみましょう。 434 | \begin{equation} 435 | f: \mathbf{x} \mapsto \begin{bmatrix} 436 | x_1 + x_2 \\ 437 | 3x_1 + \log x_2 \\ 438 | x_2^3 439 | \end{bmatrix} 440 | \end{equation} 441 | このように、要素表記で書き下すスタイルは、 442 | 定義そのものとも言えますね。 443 | これを入出力の集合で書くと次のようになります。 444 | \begin{equation} 445 | f: \mathbb{R}^2 \to \mathbb{R}^3 446 | \end{equation} 447 | 448 | \subsection{関数は太字にすべきか} 449 | 出力がベクトルのときに関数を太字にするかどうかは、ケースバイケースだと思います。 450 | すなわち、 451 | \begin{equation} 452 | \mathbf{f}: \mathbb{R}^2 \to \mathbb{R}^3 453 | \end{equation} 454 | とする例です。こうすると 455 | $\mathbf{z} = \mathbf{a} + \mathbf{f}(\mathbf{x})$ 456 | のようにベクトルに関する数式がすべて太字になり、 457 | 美しい場面もあります。一方で、 458 | 近年のコンピュータビジョンの論文中の式では 459 | 「論文中に出現する全ての関数はベクトルを出力する」といった場面も多々あります。 460 | そのような場合、すべてが太字になっているとちょっと 461 | うるさい、と感じるかもしれません。 462 | よって、ベクトル出力の関数を太字にするかどうかは 463 | ケースバイケースだと思います。 464 | 465 | \subsection{要素形式か集合形式か} 466 | 467 | 集合と要素はどちらの形式で書く方がよいのでしょうか? 468 | 多くの場合は集合で表記するほうが有用だと思います。なぜなら、 469 | 読者が知りたいのは入力と出力として取りうる値が何なのか、という点だからです。 470 | 集合で書けば、入力と出力が取り得る範囲を明示的に述べることができます。 471 | 要素の表記は、そのインスタンスを述べているに過ぎません。 472 | 473 | 一方で、要素の表記のほうがわかりやすい、「物体検出器」の例も見てみましょう。 474 | 以下はちょっとうるさい人工的な例であり実際はこのように書く人は少ないと思いますが、 475 | 例として紹介します。 476 | 各画素が$0$から$255$までの値をとり、 477 | RGBの3チャンネルをもつ画像$\mathbf{I} \in \{0, \dots, 255\}^{H \times W \times 3}$ 478 | を考えます。ここで$H$, $W$は画像の高さと幅です。 479 | この画像を物体検出器$f$に入力することを考えます。 480 | 出力は$K$クラス認識結果を表すラベル$l \in \{1, \dots, K\}$、 481 | 検出領域のバウンディングボックス$\mathbf{b} = [y, x, h, w]^\top \in \mathbb{N}^4$、 482 | およびその確信度$\alpha \in \mathbb{R}$とします。 483 | ここでバウンディングボックスとは画像中の注目領域を矩形として指定したものです。 484 | 矩形を表現するために、4つのスカラー値が用いられます。 485 | ここで$y, x$はバウンディングボックスの左上の座標値、$h, w$はバウンディングボックスの幅と高さだとします。 486 | これを集合で正確に表記しようとすると 487 | \begin{equation} 488 | f: \{0, \dots, 255\}^{H \times W \times 3} \to \{1, \dots, K\} \times \mathbb{N}^4 \times \mathbb{R} 489 | \end{equation} 490 | となります。この記述は厳密ですが、次のような問題もあります。 491 | まず、$H$や$W$といった値は本質的に重要な概念では無いかもしれません。であれば、そのためだけに 492 | わざわざアルファベットを2つ消費したうえにそれらについて説明の文章を書くメリットが無いかもしれません。 493 | また、画素値を述べることの意味も薄いかもしれません。なぜなら、画素の範囲を0から255に 494 | 設定したのは単に実装上の都合であり、「0から1」と定義しても一般的には構わないからです。 495 | ここでは、要素表記を採用すると 496 | そのような部分を抽象化できます。例えば次のようにします。 497 | \begin{screen} 498 | $K$クラス識別の物体検出器$f: \mathbf{I} \mapsto (l, \mathbf{b}, \alpha)$を考える。 499 | これは画像$\mathbf{I}$を 500 | 受け取り、ラベル$l \in \{1, \dots, K\}$、バウンディングボックス$\mathbf{b} = [y, x, h, w]^\top \in \mathbb{N}^4$、 501 | およびその確信度$\alpha \in \mathbb{R}$を返す。 502 | \end{screen} 503 | これらは、「意図的に変数のドメインを隠したい例」だと言えます。 504 | 505 | 506 | 507 | \section{集合の表記} 508 | 509 | $N$個の要素の集合を表す表記$\{x_1, x_2, \dots, x_N\}$を省略して記述したいとき、つい以下のように書きがちです。 510 | \begin{equation} 511 | \{x_i \mid i=1, 2, \dots, N \} 512 | \end{equation} 513 | あるいは、 514 | \begin{equation} 515 | \{x_i \mid 1 \le i \le N \} 516 | \end{equation} 517 | あるいは、 518 | \begin{equation} 519 | \{x_i \mid i \in \{1, 2, \dots, N\} \} 520 | \end{equation} 521 | などです。これらでも構わないのですが、この場合は良く知られている省略記法を用いて次のように 522 | 書くとスッキリするでしょう。 523 | \begin{equation} 524 | \{ x_i \}_{i=1}^N 525 | \end{equation} 526 | ここでは、下付き文字でインデクスの始まりを定義し、上付き文字でその終わりを示します。 527 | この表記は、言われてみれば当たり前なのですが、案外思いつかない場面が多いようです。 528 | 529 | ここで知っておくと便利かもしれない小ネタを紹介します。 530 | 集合を表記する際、その大きさは重要でなかったり決定できない場合があります。 531 | あるいはアルファベットが足りないので「$N$」という 532 | ようにアルファベットを割り振りたくないかもしれません。 533 | その場合は、「宣言時には最終要素を明示しない。要素数が必要なときは$|\cdot|$の表記を使う」 534 | という方式が便利です。 535 | すなわち、集合$\mathcal{X}$を次のように定義します。 536 | \begin{equation} 537 | \mathcal{X} = \{x_1, x_2, \dots \} 538 | \end{equation} 539 | そして、この要素数は$\vert \mathcal{X} \vert$のように書けます。 540 | 541 | この方式を使うと、集合そのものにアルファベットが必要になる一方で、 542 | 集合の個数を示すアルファベットは必要なくなります。 543 | これは例えば次のように複数の集合を考える場合に便利です。 544 | 3つの集合を考えます。それをそれぞれ 545 | \begin{equation} 546 | \{x_i\}_{i=1}^N, ~~ \{y_i\}_{i=1}^M, ~~ \{z_i\}_{i=1}^K. 547 | \end{equation} 548 | のように定義してしまうと、 $N, M, K$といった3つの関係ないアルファベットを消費してしまいます。 549 | また、インデックスを表す$i$が共有されてしまい、不都合が生じるかもしれません。 550 | かといってインデックスを$i$, $j$, $k$のように使ってしまうと、それもまたアルファベットを 551 | 消費します。 552 | これを次のように定義すれば、アルファベットは要素との対応をもったmathcal 553 | で表現でき、直感的です。 554 | \begin{equation} 555 | \mathcal{X} = \{x_1, x_2, \dots \}, ~~ 556 | \mathcal{Y} = \{y_1, y_2, \dots \}, ~~ 557 | \mathcal{Z} = \{z_1, z_2, \dots \}. 558 | \end{equation} 559 | そして、要素数が必要になったときは$\vert \mathcal{X} \vert$を使えます。 560 | 561 | 562 | 563 | 564 | 565 | \section{下付き文字・上付き文字} 566 | 可読性を下げるので、\textbf{変数に対する下付き文字・上付き文字は可能な限り減らす}ことをおすすめします。 567 | 例えば 568 | \begin{equation} 569 | x_{i, j}^k 570 | \end{equation} 571 | のような変数は、$i, j, k$が何かを考えながら読む必要があります。 572 | 出来るだけそれらを消せないか考えるとよいです。 573 | また、 574 | \begin{equation} 575 | x_{a_i} 576 | \end{equation} 577 | のように「下付きの下付き」は可能な限りやめたほうが良いです。 578 | これは$x_a$対し$i$が下付き文字なのか、 579 | $x$に対し$a_i$が下付き文字なのか区別がつきません。 580 | 581 | 下付き文字を減らせる一つの例はループ周回のインデクスです。 582 | 例えば次のPythonコードを考えましょう。 583 | \begin{minted}[mathescape, % 数式使える 584 | linenos, % 行番号 585 | fontfamily=courier, % いい感じのフォント 586 | breaklines, % 長すぎる行をうまく改行 587 | %breakindent=20pt, % 改行後の左からの幅 588 | %fontsize=\small, % フォントサイズ 589 | numbersep=2pt, % 行番号の内側よせ余白 590 | frame=single, % lines:上下に線 single:線で囲う 591 | %baselinestretch=0.7, % 行間 592 | ]{python} 593 | V = [1.0, 2.0, 4.0, 8.0] 594 | 595 | for n in range(len(V)): 596 | print(V[n]) # (1) 597 | 598 | for v in V: 599 | print(v) # (2) 600 | \end{minted} 601 | ここで、(1)はループインデクスを用意して要素にアクセスしています。 602 | 一方で、(2)は集合の要素を直接イテレーションする形式です。 603 | Pythonでは、無駄な変数$i$を使わない(2)のほうが推奨されますね。 604 | これと同じことが数式の表記でも言えます。 605 | 例えばデータ$\mathcal{V} = \{v_n\}_{n=1}^N$を考えます。ここで 606 | $\mathcal{V}$の要素に対し、インデクス$n$に依存しない処理を述べたいとします。 607 | このとき、 608 | \begin{itemize} 609 | \item $v_n$に対し関数$f$を適用した$f(v_n)$を・・ 610 | \end{itemize} 611 | のようにするのではなく、 612 | \begin{itemize} 613 | \item ここで$\mathcal{V}$中の要素$v \in \mathcal{V}$について考える。これに関数$f$を適用した$f(v)$を・・ 614 | \end{itemize} 615 | のように言い換えれば、ループインデクスを減らせます。 616 | 617 | また、うっかり下付き文字を太字にしないように注意しましょう。 618 | これは相当頻繁におきるミスです。 619 | \begin{itemize} 620 | \item \mintinline{tex}{\mathbf{x}_i}: $\mathbf{x}_i$: OK 621 | \item \mintinline{tex}{\mathbf{x_i}}: $\mathbf{x_i}$: ダメ 622 | \end{itemize} 623 | 下付き文字を太字にすると、「太字すなわちベクトルによって要素指定がされる」と解釈されてしまいます。 624 | たとえば、もし別の部分で$\mathbf{i}=[1, 2]^\top$のような変数が定義されていれば、 625 | 下付き文字にそれを使ったのか?すなわち、$\mathbf{x}_{1, 2}$ 626 | と言いたいのか?と思われてしまいます。 627 | 628 | 629 | また、二文字以上のアルファベットをラベルの意味で 630 | 下付きないし上付きにつけるときは、ローマン(\mintinline{tex}{\mathrm})にすることをオススメします。 631 | \begin{itemize} 632 | \item \mintinline{tex}{x_\mathrm{in}}: $x_\mathrm{in}$: OK 633 | \item \mintinline{tex}{x_{in}}: $x_{in}$: 推奨しない 634 | \end{itemize} 635 | これは、まず、ローマンにしない場合は見にくいです。 636 | そして、ローマンにしない場合は、上記の場合$i$と$n$という変数があってその積の値$i \cdot n$が 637 | 下付き文字にきているのか、と解釈されてしまいます。 638 | そのような誤解を招かないために、ラベルのアルファベットはローマンにすることをすすめます。 639 | 640 | 641 | \section{英単語をそのまま数式中で使わない} 642 | 慣習となっている場合を除き、関数名に英単語をそのまま使わないほうがいいです。 643 | \begin{itemize} 644 | \item $y = s(x) + 10$: OK 645 | \item $y = score(x) + 10$: ダメ 646 | \end{itemize} 647 | これは下付き文字の場合と同じ理由です。 648 | 数式環境はアルファベットを並べて英単語を表現することを想定していないため、上でわかるように、イタリックが並んだ表記は見にくいです。 649 | そして、上の例だと、$score$ は$s \cdot c \cdot o \cdot r \cdot e$だと解釈出来てしまいます。 650 | なので、英単語をそのまま使うことはやめて、事前に関数として定義しましょう。 651 | どうしても英単語などを使いたいときは、せめてローマンにして、つながっている単語だとアピールすることをオススメします。 652 | たとえば、バッチノーマライゼーションを表す関数を考えるとき、$BN(x)$よりも、$\mathrm{BN}(x)$のほうがまだ良いと思います。 653 | なぜなら、$BN(x)$は$B \cdot N(x)$だと読めてしまうので。 654 | 655 | 656 | \section{numpy表記に引っ張られない} 657 | numpyはブロードキャストという機能により、「ベクトルとスカラー」のように 658 | ドメインが違う変数同士でも演算が可能です。しかし、それは数式では自明ではありません。 659 | よって、そのような\textbf{numpy固有の表記を使わないように注意しましょう。} 660 | 661 | \subsection{違ったドメイン同士の演算をしない} 662 | 査読でよく見る例を紹介します。ベクトル$b$(太字にしていない!)に対し、閾値処理をしようと思い、 663 | $b$の全ての要素からスカラー$\tau$を引いたものを考えます。 664 | これをうっかり次のように書く人が多いです。 665 | \begin{equation} 666 | b - \tau 667 | \end{equation} 668 | これは、numpyでは可能です。すなわち、$\tau$がブロードキャスト 669 | され、$b$中の全ての要素に対する演算となってくれます。 670 | しかし、そのような表記は数式では不可能です。値を代入してみるとわかります。 671 | $b=[10, 20, 30]^\top$, $\tau=5$とすると、 672 | \begin{equation} 673 | \begin{bmatrix} 674 | 10 \\ 675 | 20 \\ 676 | 30 677 | \end{bmatrix} - 5 678 | \end{equation} 679 | となります。このようにベクトルからスカラーを引くことはおかしいですよね。しかし、 680 | なぜかnumpy表記に引っ張られて上のように書いてしまう人が多いのです。 681 | 上を正しく記述するには、$b$をちゃんと太字にしたうえで、 682 | 要素が全て1であるベクトル$\mathbf{1} = [1, 1, \dots, 1]^\top$を導入し、 683 | \begin{equation} 684 | \mathbf{b} - \tau\mathbf{1} 685 | \end{equation} 686 | とすると正しい式になります。 687 | このようなミスを防ぐためにも、 688 | ベクトルは太字にすることを推奨します\footnote{ちなみに、四元数の計算などではスカラーと 689 | ベクトルを足すような表記をとることもあります。}。 690 | 691 | \subsection{具体的な失敗例} 692 | この発展版として、極めてよく見る次のようなケースを考えましょう。 693 | 以下、特徴マップは高さ3, 幅4, チャンネル数2だとします。 694 | \begin{screen} 695 | あるCNNの出力の特徴マップを$X$、別のCNNの出力特徴マップを$Y$とする。 696 | ここで要素が0か1のマスク行列$B$を考える。マスクの値が1のときは$X$、0のときは$Y$ 697 | を採用することにより、$X$と$Y$を結合した結果のマップである$Z$を次のように計算する。 698 | \begin{equation} 699 | Z = BX + (1-B)Y 700 | \end{equation} 701 | \end{screen} 702 | というような形です。これは、numpyの表記を写しただけの、\textbf{非常に良くない表現}になっています。 703 | まず、なぜ人間は上のような式を書いてしまうのか説明します。上の式は、以下のようなnumpyの気持ちの表明になっています。 704 | 705 | \begin{minted}[mathescape, % 数式使える 706 | linenos, % 行番号 707 | fontfamily=courier, % いい感じのフォント 708 | breaklines, % 長すぎる行をうまく改行 709 | %breakindent=20pt, % 改行後の左からの幅 710 | %fontsize=\small, % フォントサイズ 711 | numbersep=2pt, % 行番号の内側よせ余白 712 | frame=single, % lines:上下に線 single:線で囲う 713 | %baselinestretch=0.7, % 行間 714 | ]{python} 715 | In [1]: import numpy as np 716 | In [2]: X = np.arange(24).reshape(2, 3, 4) 717 | In [3]: X 718 | Out[3]: 719 | array([[[ 0, 1, 2, 3], 720 | [ 4, 5, 6, 7], 721 | [ 8, 9, 10, 11]], 722 | 723 | [[12, 13, 14, 15], 724 | [16, 17, 18, 19], 725 | [20, 21, 22, 23]]]) 726 | 727 | In [4]: Y = -np.arange(24).reshape(2, 3, 4) 728 | In [5]: Y 729 | Out[5]: 730 | array([[[ 0, -1, -2, -3], 731 | [ -4, -5, -6, -7], 732 | [ -8, -9, -10, -11]], 733 | 734 | [[-12, -13, -14, -15], 735 | [-16, -17, -18, -19], 736 | [-20, -21, -22, -23]]]) 737 | 738 | In [6]: B = np.array([1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0]).reshape(3, 4) 739 | In [7]: B 740 | Out[7]: 741 | array([[1, 1, 1, 0], 742 | [0, 1, 0, 0], 743 | [0, 0, 0, 0]]) 744 | 745 | In [8]: Z = B * X + (1 - B) * Y 746 | In [9]: Z 747 | Out[9]: 748 | array([[[ 0, 1, 2, -3], 749 | [ -4, 5, -6, -7], 750 | [ -8, -9, -10, -11]], 751 | 752 | [[ 12, 13, 14, -15], 753 | [-16, 17, -18, -19], 754 | [-20, -21, -22, -23]]]) 755 | \end{minted} 756 | 757 | ここでは、$X, Y, Z$は高さ3、幅4、チャンネル数2の特徴マップを仮定しています。 758 | マスク$B$は高さ3、幅4の行列です。「T」字型が左上にあるようなマスクになっています。 759 | このマスクを$X$に適用することで、各チャンネルについて、「T」の部分を抜き出します。 760 | また、マスクが適用されない位置は$Y$の値を持ってきます。これらを足し合わせた$Z$はまさにそのようになっています。なので、 761 | 31行目の$Z=BX+(1-B)Y$を数式として記述して終わり。という思考になっています。 762 | 763 | ここでは\textbf{3点の間違い}があります。これを順番に説明します。 764 | まず、ドメインを書けるのであれば書いたほうがいいです。そして、太字にしましょう。ここでは 765 | $\mathbf{X}, \mathbf{Y}, \mathbf{Z} \in \mathbb{R}^{2 \times 3 \times 4}$であり、 766 | $\mathbf{B} \in \{0, 1\}^{3 \times 4}$が言いたいことでしょう。ここで、 767 | $\mathbf{X}, \mathbf{Y}, \mathbf{Z}$はチャンネルの軸である「$2$」を持っていますが、$\mathbf{B}$は持っていません。 768 | そして、3点の間違いは以下です。 769 | \begin{itemize} 770 | \item まず、「$(1-B)$」の差の表記は間違いです。これは\textbf{スカラから行列を引いてしまっています。} 771 | 上で学んだ通り、要素が全て1の行列$\mathbf{1}$を定義して、$(\mathbf{1} - \mathbf{B})$としましょう。 772 | このようなミスを減らすためにも、やはりベクトルや行列は太字にすることをすすめます。 773 | \item 次に、「$BX$」の積の表記は間違いです。特に断りがなければ、 774 | \textbf{行列同士の積は行列積を意味する}ことを思い出しましょう。 775 | ここで述べたい演算は\textbf{要素同士の積}ですね。 776 | なので、ここでは要素同士の積(\href{https://en.wikipedia.org/wiki/Hadamard_product_(matrices)}{アダマール積})の記号「$\odot$」 777 | を定義したうえで、 778 | $\mathbf{B} \odot \mathbf{X}$ 779 | とする必要があります。 780 | \item ですが、実はこれはまだチャンネルを考慮していないので、間違いです。すなわち、 781 | $\mathbf{B}$と$\mathbf{X}$がともに同じドメインの要素(例えば$\mathbf{B}, \mathbf{X} \in \mathbb{R}^{3\times 4}$)であればアダマール積が計算できます。 782 | しかし今回は$\mathbf{X}$は複数チャンネルを持っています($\mathbf{X} \in \mathbb{R}^{2\times3\times4}$)。どうすればよいでしょうか。 783 | \end{itemize} 784 | 785 | 上記3点の問題を解決する表記は例えば以下になります。いずれも、アダマール積、および全てが1の行列は既に定義されていると仮定します。 786 | 一つ目の方法は、各チャンネルに注目する方式です: 787 | \begin{screen} 788 | あるCNNの出力の特徴マップのうち$c$チャンネル目を$\mathbf{X}\in\mathbb{R}^{3 \times4}$とし、 789 | 同様に別のCNNの特徴マップの$c$チャンネル目を$\mathbf{Y} \in \mathbb{R}^{3 \times4}$とする。このとき、 790 | バイナリマスク$\mathbf{B}\in\{0, 1\}^{3\times 4}$を考える。このバイナリマスクにより以下を計算する。 791 | \begin{equation} 792 | \mathbf{Z} = \mathbf{B} \odot \mathbf{X} + (\mathbf{1} - \mathbf{B}) \odot \mathbf{Y} 793 | \end{equation} 794 | \end{screen} 795 | この方式だと、出力の$\mathbf{Z}$もある$c$チャンネル目についての値になるので注意してください。 796 | ここでは元の特徴マップを$\mathbf{X} \in \mathbb{R}^{2\times 3 \times 4}$として、 797 | $c$チャンネル目を$\mathbf{X}^c \in \mathbb{R}^{3 \times 4}$ 798 | とか$\mathbf{X}_c \in \mathbb{R}^{3 \times 4}$としてもよいです。 799 | ですがそうすると式が複雑になります。 800 | 複雑にしてでも正確に伝えたいか、あるいはそこは抽象化して本来強調したいところを強調すべきか、 801 | ケースバイケースですので、よく考えて決めるとよいと思います。 802 | 803 | あるいは、マスクを複製する方式もあります。 804 | \begin{screen} 805 | あるCNNの出力である2チャンネルの特徴マップを$\mathbf{X}\in\mathbb{R}^{2 \times3 \times 4}$とし、 806 | 同様に別のCNNの特徴マップを$\mathbf{Y}\in\mathbb{R}^{2\times 3\times 4}$とする。このとき、 807 | バイナリマスク$\mathbf{B}_0\in\{0, 1\}^{3\times 4}$を考え、それをチャンネル方向に複製して結合したものを 808 | $\mathbf{B}\in\{0, 1\}^{2 \times 3\times 4}$とする。このとき、次を考える。 809 | \begin{equation} 810 | \mathbf{Z} = \mathbf{B} \odot \mathbf{X} + (\mathbf{1} - \mathbf{B}) \odot \mathbf{Y} 811 | \end{equation} 812 | \end{screen} 813 | この方式だと、$\mathbf{B}_0$という別の変数を使ってしまいましたが、当初の表現にだいぶ近いです。 814 | 815 | ポイントは、\textbf{10年後に読まれても理解できる記述を心掛ける点}だと思います。 816 | 「どうせみんなnumpyを知っているからわかってもらえるだろう」とか、「流行っているフレームワークの記法なのでOK」 817 | といった考えはやめましょう。研究とは知識を積み重ねることなので、いつ読まれても理解できるような客観的に正しい数式で書くことが重要です。 818 | numpyやpytorchが10年後にみんな読めるかはわかりません。 819 | 820 | 821 | 822 | 823 | 824 | \section{量化子は使わない} 825 | 量化子($\forall および \exists$)を使いこなすことは難しいです。 826 | もし曖昧な気持ちで使っているのであれば、書かないことをオススメします。 827 | 828 | 829 | \section{どうしてもうまい書き方がわからないときは} 830 | もし説明したい内容を数式で記述することがどうしても難しければ、文章と図で説明してください。 831 | \textbf{中途半端に間違っている数式を書くことは逆効果}です。 832 | 833 | \section{その他、注意すべきこと} 834 | その他、注意すべき点を述べます。 835 | \begin{itemize} 836 | \item 変数や定数のために新しくアルファベットを導入したときは、必ず説明するようにしましょう。 837 | 例えば$y=ax+b$と書いたときは、$y$も$a$も$x$も$b$も説明しましょう。 838 | 必要ないだろうと著者が変数の説明を省略することは、読者を混乱させる入口だと思います。 839 | \item 新しい概念を導入したり、一般的でない表記をする場合は、必ず初出のときに定義すると良いです。 840 | 例えばコンピュータビジョン分野では、ノルム($\Vert \mathbf{x} \Vert_2$)を導入した時でも、 841 | 「これはユークリッドノルムです」と言っておくと親切でしょう。 842 | \item 慣例で決まっている記号は、それに従いましょう。例えば単位行列を$\mathbf{A}$と定義することは不自然です。 843 | \item セクションをまたいだとしても、同じ記号を別の用途に使わないようにしましょう。例えばあるセクションで画像を$\mathbf{I}$ 844 | と定義した場合は、別のセクションで単位行列を$\mathbf{I}$として使わないようにしましょう。 845 | \item tipsですが、arXivの論文はtexのコードも公開されているため、それを読むことでお気に入りの論文の表記を真似することも出来ます。 846 | \end{itemize} 847 | 848 | \section{チートシート} 849 | 本資料で説明したポイントを\Tref{tbl:cheatsheet}にチートシートとしてまとめました。 850 | 論文を書いたらこれを参考にチェックしてみるとよいです。 851 | 852 | 853 | \begin{table*} 854 | \centering 855 | \begin{tabular}{@{}lll@{}} \toprule 856 | 推奨しない、または間違った記述 & OKな記述 & 説明 \\ \midrule 857 | ベクトルを$x$と書く & ベクトルを$\mathbf{x}$あるいは$\bm{x}$と書く & ベクトルは太字 \\ 858 | $\mathbf{x} = [1, 2, 3]$ & $\mathbf{x} = [1, 2, 3]^\top$ & ベクトルは縦ベクトルと心に決める \\ 859 | $D$次元のベクトル$\mathbf{x}$を考える & $D$次元のベクトル$\mathbf{x}\in\mathbb{R}^D$を考える & 変数はドメインを示す \\ 860 | 上付き、下付きがたくさん:$x_{i, j}^k$ & 上付き、下付きを可能な限り減らす & 上付き、下付きはわかりにくい \\ 861 | 下付きの下付き:$x_{a_i}$ & 下付きの下付きはやめる & 下付きの下付きは曖昧でわかりにくい \\ 862 | $\mathbf{x_i}$ & $\mathbf{x}_i$ & インデクスは太字にしない \\ 863 | $\mathbf{x}_{in}$ & $\mathbf{x}_\mathrm{in}$ & 下付き上付きで二文字以上の単語を使うときはローマン \\ 864 | $score(x) + 10$ & $s(x) + 10$ & 関数や変数に英単語を使わない \\ 865 | $a \in \mathbb{R}^3, b \in \mathbb{R}$ のときに $a + b$ & $\mathbf{a} + b\mathbf{1}$ & ブロードキャストをしない \\ 866 | 要素積の意味で$\mathbf{A}\mathbf{B}$ & $\odot$を定義して$\mathbf{A}\odot\mathbf{B}$ & 要素積はアダマール積 \\ 867 | 曖昧な気持ちで$\forall$や$\exists$を使っている & 使うことをやめる & 自信がなければ量化子は使わない \\ 868 | \bottomrule 869 | \end{tabular} 870 | \caption{数式のチートシート} 871 | \label{tbl:cheatsheet} 872 | \end{table*} 873 | 874 | 875 | \section{番外編:なぜロスはmathcalで引数無視なのか} 876 | 近年の深層学習の論文では、ロス関数はなぜかmathcalで表記する上に引数を省略する傾向にあります。 877 | 例えば 878 | \begin{equation} 879 | \mathcal{L}_{all} = \lambda_{adv}\mathcal{L}_{adv} + \lambda_{style}\mathcal{L}_{style} 880 | \end{equation} 881 | のような式です。この表記がいつ始まりどのように広まったのか謎なのですが、 882 | これが慣習になってしまっています。 883 | これは、実際にコーディングする際は上記の抽象化で十分であるため、 884 | 詳細は汲み取ってくれ、という表記になっています。 885 | 慣習である以上従わざるをえないという面はあるので、実際に論文を書くときは近い関連研究を参考にしてください。 886 | 887 | 上の式をより正確に書くならば、例えば次のようにするべきなのかもしれません: 888 | 訓練するパラメータを並べて$\bm{\theta}$とする。それ以外のパラメータは定数だと考える。 889 | ここで、ロス関数は 890 | \begin{equation} 891 | L_\mathrm{all}(\bm{\theta}) = \lambda_\mathrm{adv}L_\mathrm{adv}(\bm{\theta}) + \lambda_\mathrm{style}{L}_\mathrm{style}(\bm{\theta}) 892 | \end{equation} 893 | と定義される。 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | \end{document} --------------------------------------------------------------------------------