初心者データサイエンティストの備忘録

調べたことは全部ここに書いて自分の辞書を作る

【読書記録】なっとく!ディープラーニング_第5章

目次

はじめに

前回記事に書いたように、現在ディープラーニングを勉強しています。 今回は、なっとく!ディープラーニングの第5章について解説していきたいと思います。
 なお、第5章は次の流れで説明が進んでいきます。本記事もその流れに合わせています。

  1. 入力が複数、出力が1つのニューラルネットワークの更新式を導出する
  2. 入力が1つ、出力が複数のニューラルネットワークの更新式を導出する
  3. 入力が複数、出力も複数のニューラルネットワークの更新式を導出する
  4. MNISTデータセットニューラルネットワークを適用させる

 1, 2を理解すれば3の理解は簡単です。一方で4を理解することは難しく、きっちりと理解したいのであれば、しっかりと本書を読み込むべきだと思います。

勾配降下法のおさらい

 勾配降下法とは、ディープラーニングにおいてパラメータを推定する手法の一つです。パラメータを下記の更新式にしたがって更新します。


\omega _ {(n+1)} = \omega _ {(n)} - \eta \dfrac{\partial L}{\partial \omega}(\omega _ {(n)} )

ただし、\omega _ {(n+1)}は更新後のパラメータ、\omega _ {(n)}は更新前のパラメータ、\etaは学習率、Lは損失関数です。 \dfrac{\partial L}{\partial \omega}(\omega _ {(n)} )によって更新の方向が、 \etaによって更新の大きさが決まります。
 前回記事では、入力が一つ、出力も一つ、層も一つのニューラルネットワークについて、具体的な更新式を説明しました。本記事では、入力や出力が複数になった場合のニューラルネットワークについて、勾配降下法の更新式を導出します。

入力が複数、出力は1つのニューラルネットワーク

 図1のようなニューラルネットワークにおける勾配降下法の更新式を具体的に導出します。

図1:入力が複数、出力は1つのニューラルネットワーク

 図1のニューラルネットワークの形から、予測値\hat{y}は、


\hat{y} = \omega_1 x_1 + \omega_2 x_2 + \omega_3 x_3

となります。したがって、損失関数Lは、


\begin{eqnarray}
L(\omega_1, \omega_2, \omega_3) &=& (\hat{y}-y)^2 \\
&=& (\omega_1 x_1 + \omega_2 x_2 + \omega_3 x_3-y)^2
\end{eqnarray}

となります。したがって、勾配\dfrac{\partial L}{\partial \omega}は、


\dfrac{\partial L}{\partial \omega} = 
\left(
\begin{array}{c}
\dfrac{\partial L}{\partial \omega_1} \\
\dfrac{\partial L}{\partial \omega_2} \\
\dfrac{\partial L}{\partial \omega_3} \\
\end{array}
\right)
= \left(
\begin{array}{c}
x_1 (\hat{y}-y) \\
x_2 (\hat{y}-y) \\
x_3 (\hat{y}-y) \\
\end{array}
\right)

となります。したがって、更新式は


\left(
\begin{array}{c}
\omega_{1(n+1)} \\
\omega_{2(n+1)} \\
\omega_{3(n+1)} \\
\end{array}
\right)
=
\left(
\begin{array}{c}
\omega_{1(n)} \\
\omega_{2(n)} \\
\omega_{3(n)} \\
\end{array}
\right)
-\eta
\left(
\begin{array}{c}
x_1 (\hat{y}-y) \\
x_2 (\hat{y}-y) \\
x_3 (\hat{y}-y) \\
\end{array}
\right)

となります。

入力が1つ、出力が複数のニューラルネットワーク

 図2のようなニューラルネットワークにおける勾配降下法の更新式を具体的に導出します。

図2:入力が1つ、出力が複数のニューラルネットワーク

図2のニューラルネットワークの形から、予測値\hat{y} _ 1, \hat{y} _ 2, \hat{y} _ 3は、


\begin{eqnarray}
\hat{y}_1 &=& \omega_1 x \\
\hat{y}_2 &=& \omega_2 x \\
\hat{y}_3 &=& \omega_3 x \\
\end{eqnarray}

となります。また、この場合損失関数が出力ごとに存在するため、損失関数は、


\begin{eqnarray}
L_1 &=& (\hat{y}_1-y)^2 = (\omega_1 x-y)^2 \\
L_2 &=& (\hat{y}_2-y)^2 = (\omega_2 x-y)^2\\
L_3 &=& (\hat{y}_3-y)^2 = (\omega_3 x-y)^2 \\
\end{eqnarray}

となります。したがって、勾配\dfrac{\partial L}{\partial \omega}は、


\dfrac{\partial L}{\partial \omega} = 
\left(
\begin{array}{c}
\dfrac{\partial L}{\partial \omega_1} \\
\dfrac{\partial L}{\partial \omega_2} \\
\dfrac{\partial L}{\partial \omega_3} \\
\end{array}
\right)
= \left(
\begin{array}{c}
x (\hat{y}_1-y) \\
x (\hat{y}_2-y) \\
x (\hat{y}_3-y) \\
\end{array}
\right)

となります。したがって、更新式は


\left(
\begin{array}{c}
\omega_{1(n+1)} \\
\omega_{2(n+1)} \\
\omega_{3(n+1)} \\
\end{array}
\right)
=
\left(
\begin{array}{c}
\omega_{1(n)} \\
\omega_{2(n)} \\
\omega_{3(n)} \\
\end{array}
\right)
-\eta
\left(
\begin{array}{c}
x (\hat{y}_1-y) \\
x (\hat{y}_2-y) \\
x (\hat{y}_3-y) \\
\end{array}
\right)

となります。

入力が複数、出力も複数のニューラルネットワーク

 図3のようなニューラルネットワークにおける勾配降下法の更新式を具体的に導出します。

図3:入力も出力も複数のニューラルネットワーク

考え方はシンプルで、図3のニューラルネットワークを二つに分解します(図4)。

図4:ニューラルネットワークの分解

図4のニューラルネットワークのうち、A、Bの部分はそれぞれ入力が複数、出力が一つのニューラルネットワークと同じ形をしています。したがって、更新式の導出は上で説明した考え方を使えば良いです。

 上で説明した考え方を使うと、Aの部分の更新式は


\left(
\begin{array}{c}
\omega_{11(n+1)} \\
\omega_{21(n+1)} \\
\omega_{31(n+1)} \\
\end{array}
\right)
=
\left(
\begin{array}{c}
\omega_{11(n)} \\
\omega_{21(n)} \\
\omega_{31(n)} \\
\end{array}
\right)
-\eta
\left(
\begin{array}{c}
x_1 (\hat{y}_1-y_1) \\
x_2 (\hat{y}_1-y_1) \\
x_3 (\hat{y}_1-y_1) \\
\end{array}
\right)

となります。同様にBの更新式は、


\left(
\begin{array}{c}
\omega_{12(n+1)} \\
\omega_{22(n+1)} \\
\omega_{32(n+1)} \\
\end{array}
\right)
=
\left(
\begin{array}{c}
\omega_{12(n)} \\
\omega_{22(n)} \\
\omega_{32(n)} \\
\end{array}
\right)
-\eta
\left(
\begin{array}{c}
x_1 (\hat{y}_2-y_2) \\
x_2 (\hat{y}_2-y_2) \\
x_3 (\hat{y}_2-y_2) \\
\end{array}
\right)

です。これらの式を行列の形でまとめると(つまり、Aの部分を1列目、Bの部分を2列目にする)


\left(
\begin{array}{c}
\omega_{11(n+1)} & \omega_{12(n+1)} \\
\omega_{21(n+1)} & \omega_{22(n+1)} \\
\omega_{31(n+1)} & \omega_{32(n+1)} \\
\end{array}
\right)
=
\left(
\begin{array}{c}
\omega_{11(n)} & \omega_{12(n)} \\
\omega_{21(n)} & \omega_{22(n)} \\
\omega_{31(n)} & \omega_{32(n)} \\
\end{array}
\right)
-\eta
\left(
\begin{array}{c}
x_1 (\hat{y}_1-y_1) & x_1 (\hat{y}_2-y_2) \\
x_2 (\hat{y}_1-y_1) & x_2 (\hat{y}_2-y_2) \\
x_3 (\hat{y}_1-y_1) & x_3 (\hat{y}_2-y_2) \\
\end{array}
\right)

となります。

コードに落とし込む

 最後の更新式をJuliaで書くと以下のようになります。

using LinearAlgebra

# 特徴量
toes = [8.5, 9.5, 9.9, 9.0]
wlrec = [0.65, 0.8, 0.8, 0.9]
nfans = [1.2, 1.3, 0.5, 1.0]

# 目的変数
hurt = [0.1, 0.0, 0.0, 0.1]
win = [1, 1, 0, 1]
sad = [0.1, 0.0, 0.1, 0.2]

# ニューラルネットワークの入力
input = [toes[1], wlrec[1], nfans[1]]

# ニューラルネットワークの出力
truth = [hurt[1], win[1], sad[1]]

# 重みの初期値
weights = [0.1 0.1 -0.3; 0.1 0.2 0.0; 0.0 1.3 0.1]

# 学習率
alpha = 0.005

# 100回だけ更新
for i = 1:100
    ## pred_vecの計算
    pred_vec = weights*input

    ## delta_vecの計算
    delta_vec = pred_vec-truth

    ## weights_delta_matrixの計算
    weights_delta_matrix = zeros(size(input)[1], size(delta_vec)[1])

    for i = 1:size(input)[1]
        for j = 1:size(delta_vec)[1]
            setindex!(weights_delta_matrix, input[i]*delta_vec[j], i, j)
        end
    end

    ## 更新
    weights -= alpha*weights_delta_matrix

    ## Errorの計算
    pred_vec = weights*input
    for delta in (pred_vec-truth)
        println(delta^2)
    end

    println("---")
    
end

MNISTデータセットニューラルネットワークを適用させる

 本書の5.7節ではMNISTデータセットに対して、ニューラルネットワークを構築するトピックが出ています。本節では、理論の解説がなされているだけでコードが載っていなかったので、自分でJuliaで書いてみました。
 ただし、ここまでの流れに沿ってデータが一つしかない場合ニューラルネットワークを構築しています。したがって、本書と結果が異なることはご了承ください。また、問題設定はここには記載しません。詳しくは本書を読んでいただければと思います。

パッケージの導入

 まずは、必要なパッケージをインストールします。

import Pkg
# 必要なパッケージのinstall
Pkg.add("MLDatasets")
Pkg.add("Flux")

データセットの入手

 次にデータセットを入手します。今回はデータセットを一つしか使わない、かつ精度検証も行わないので学習用データだけ読み込みます。

using MLDatasets
x_train, y_train = MLDatasets.MNIST.traindata(Float32)

データの前処理

 データを今回作ったニューラルネットワークのコードに流し込める形に変換します。

using Flux
using Flux.Data: DataLoader
using Flux: onehotbatch, onecold

x_train = Flux.flatten(x_train)
y_train = onehotbatch(y_train, 0:9)

ニューラルネットワークの学習

 最後にニューラルネットワークを学習させます。

# ニューラルネットワークの入力
input = x_train[:, 1]

# ニューラルネットワークの出力
truth = y_train[:, 1]

# 重みの初期値
weights = zeros(size(y_train)[1], size(x_train)[1], )

# 学習率
alpha = 0.005

# 10回だけ更新
for i = 1:100
    ## pred_vecの計算
    pred_vec = weights*input

    ## delta_vecの計算
    delta_vec = pred_vec-truth

    ## weights_delta_matrixの計算
    weights_delta_matrix = zeros(size(delta_vec)[1], size(input)[1])

    for i = 1:size(delta_vec)[1]
        for j = 1:size(input)[1]
            setindex!(weights_delta_matrix, delta_vec[i]*input[j], i, j)
        end
    end

    ## 更新
    weights -= alpha*weights_delta_matrix

    ## Errorの計算
    pred_vec = weights*input
    
    for delta in (pred_vec-truth)
        println(delta^2)
    end

    println("---")
    
end

結果

 最後に学習されたパラメータをヒートマップで表示しました(図5)。なんとなく、5と書かれていることが見て取れます(向きは変ですが、、、)。 これはデータセットの1個目の目的変数の値が5だったためです。

using Pkg
Pkg.add("Plots")
using Plots

# ヒートマップで推定されたパラメータを表示する
heatmap(reshape(reshape(weights, 10, 784)'[:, 6], 28, 28)) # 5の場合

図5:推定されたパラメータをヒートマップで表示した結果

まとめ

 本記事では、なっとく!ディープラーニングにしたがい、下記の流れで単層のニューラルネットワークに関する理論を紹介しました。

  1. 入力が複数、出力が1つのニューラルネットワークの更新式を導出する
  2. 入力が1つ、出力が複数のニューラルネットワークの更新式を導出する
  3. 入力が複数、出力も複数のニューラルネットワークの更新式を導出する
  4. MNISTデータセットニューラルネットワークを適用させる

 また、「入力が複数、出力が複数のニューラルネットワークの更新式を導出する」と「MNISTデータセットニューラルネットワークを適用させる」については、Juliaによるコードも付記しました。
 次回はいよいよ層を複数に拡張したニューラルネットワークについて勉強していきます。非常に楽しみです。

【読書記録】なっとく!ディープラーニング_第4章

目次

はじめに

 現在、ディープラーニング(DL)は様々な分野で使われています。今流行の生成AIなんて、DLの塊です。また、私の所属する会社で行われているセキュリティネットワークの研究においても、DLは重要な意味合いを持っています。
 その一方で、私自身ちゃんとDLについて過去に勉強してきたことがありません。したがって、私にとってDLは、データサイエンスにおける超重要な技術であるにもかかわらず、自信を持って語ることができない技術の一つになっています。そこで2023年度の下期は、体系的にDLを学ぶべくなっとく!ディープラーニングを読むことにしました。
 本記事では、自分が躓いた第4章について説明していきたいと思います。

第4章の理解の仕方

 第4章のテーマは、勾配降下法です。私自身は本書の説明だけでは理解ができず、ネットでググった数式を見ながら本書を読み解きました。私は下記の流れで第4章を理解しました。

  1. 勾配降下法の更新式を理解する
  2. データが一つの場合の勾配降下法の更新式を、実際に導出する
  3. 本書に書かれているコードと照らし合わせる

勾配降下法の更新式を理解する

 図1のような最もシンプルなニューラルネットワークを考えます。

図1:特徴量と目的変数がともに1次元で1層のニューラルネットワーク

このとき、\omegaの勾配降下法の更新式は、


\omega _ {(n+1)} = \omega _ {(n)} - \eta \dfrac{\partial L}{\partial \omega}(\omega _ {(n)} )

となります。ただし、\omega _ {(n+1)}は更新後のパラメータ、\omega _ {(n)}は更新前のパラメータ、\etaは学習率、Lは損失関数です。

 勾配降下法の更新式がこのような形になっている理由については、勾配降下法が分かりやすかったです。

 大事なことは、パラメータを更新する方向\dfrac{\partial L}{\partial \omega}(\omega _ {(n)} )で定め、更新する大きさを学習率\etaで定めるということです。

データが一つの場合の勾配降下法の更新式を、実際に導出する

 本書では、損失関数LとしてMean Square Error(MSE)を使っています。また、図1より予測値は\omega xとなります。したがって、


\begin{aligned}
\dfrac{\partial L}{\partial \omega} & = \dfrac{\partial}{\partial \omega}(y-\omega x)^2 \\
&= -2x(y-\omega x)
\end{aligned}

となります。したがって、更新式は、


\begin{aligned}
\omega _ {(n+1)} &= \omega _ {(n)} - \eta \times (-2x(y-\omega x)) \\
&= \omega _ {(n)} - 2\eta \times x(\omega x-y) \\
\end{aligned}

となります。

本書に書かれているコードと照らし合わせる

 本書のp. 56, 57に書かれているコードと更新式を照らし合わせたものが表1です。

表1:コードと更新式の対応表

まとめ

 本書の第4章では、勾配降下法について説明されています。繰り返しになりますが、私は下記の手順で理解しました。

  1. 勾配降下法の更新式を理解する
  2. データが一つの場合の勾配降下法の更新式を、実際に導出する
  3. 本書に書かれているコードと照らし合わせる

 これにより、特徴量・目的変数が1次元の1層のニューラルネットワークについて、パラメータの学習の仕方を理解することができました。 これで、特徴量・目的変数が複数次元で、複数層のニューラルネットワークについて勉強していく準備ができたと考えています。

pcapファイルの構造:実際にバイト列を確認してみた

目次

はじめに

 パケットデータを保存するファイルの一つに、pcapファイルがあります。pcapファイルはパケットデータを保存するファイル形式としては定番であり、その構造を知っていることはpcapファイルを扱う際に大きなアドバンテージとなります。
 そこで、本記事では以下の2つの内容についてまとめようと思います。

  1. pcapファイルの構造
  2. pcapファイルの中身を16進数表記した結果

 

pcapファイルの構造

 pcapファイルは、「File Header(24バイト)+Packet Header(16バイト)+Packet Data(可変長)+以降、Packet Header(16バイト)+Packet Dataがパケット分繰り返される」という構造になっています(図1)。

図1:pcapファイルの構造

 File Headerや、Packet Headerの具体的な中身については、.pcapファイルについてちょっと調べたPCAP Capture File Formatが分かりやすかったので、そちらをご覧ください。本記事では、pcapファイルのバイト列が、上記のサイトに載っているフォーマットでちゃんと並んでいることを可視化しようと思います。

pcapファイルの中身を見てみた

 まず最初にPythonのScapyというライブラリでpcapファイルを作成します。その後、実際にpcapファイルをバイト列で直接見るということをしてみます。

pcapファイルの作成

 pcapファイルは下記のコードで作成することができます。

# 利用ライブラリ
from scapy.all import Ether, IP, TCP, wrpcap

# パケットの作成
pkt1 = Ether()/IP()/TCP()
pkt2 = Ether()/IP()/TCP()

# パケットをまとめる
pkt_list = [pkt1, pkt2]

# pcapファイルを出力する
wrpcap("sample.pcap", pkt_list)

バイト列を直接観測する

 pcapファイルをバイト列で読み込み表示します。コードは下記です。

with open("sample.pcap", "rb") as f:
    data = f.read()

# 16進数表記に変換し、表示
print(data.hex())

 出力結果は、下記のようになりました。

d4c3b2a1020004000000000000000000ffff0000010000008039fb64746109003600000036000000ffffffffffff000000000000080045000028000100004006fbce000000007f00000100140050000000000000000050022000107e00008039fb64746109003600000036000000ffffffffffff000000000000080045000028000100004006fbce000000007f00000100140050000000000000000050022000107e0000

バイト列の解釈

 上記で長いバイト列を表示しました。これを解釈していこうと思います。なお、私が使っているCPUがintel製だからかリトルエンディアンでデータが格納されています。なので、逆順に読み直しながら解釈していきます。

File Headerの中身

Pythonの16進数表記は、2桁で1バイトです。したがって、24バイトのFile Headerを見るには、最初の48桁を取り出してくればOKです。最初の48桁は下記の通りです。

d4c3b2a1020004000000000000000000ffff000001000000

 File Headerを取り出してみましたが、これだけでは何がなんだかわかりません。File Headerをさらに分解したものが図2です。

図2:File Headerの構造

このようにFile Headerの中身を16進数表記すると、各要素の値を確認することができます。

Packet Headerの中身

 Packet Headerは16バイトなので、File Headerに続く32桁を取得します。32桁を取得した値が下記です。

8039fb64746109003600000036000000

 Packet Headerについても、File Headerと同様に中身を分解してみます。

図3:Packet Headerの構造

Packet Dataの中身

 Packet Dataの中身については、今回は触れません。理由としては、今回の場合Ethernetヘッダ、IPヘッダ、TCPヘッダの知識が必要になるからです。

まとめ

 本記事では、下記の2つの内容についてまとめました。

  1. pcapファイルの構造
  2. pcapファイルの中身を16進数表記した結果

 1については、pcapファイルは、「File Header(24バイト)+Packet Header(16バイト)+Packet Data(可変長)+以降、Packet Header(16バイト)+Packet Dataがパケット分繰り返される」という構造になっていることを説明しました。また、File Header、Packet Headerについてはさらに複数の要素に分解できることを説明しました。

 2については、PythonのScapyを用いてpcapファイルを実際に作成し、作成したpcapファイルをバイト列として再度読み込むということをしました。そして、読み込んだバイト列を16進数表記し、それと各要素との対応関係を確認しました。

 本記事を通じて、読者の方のpcapファイルに対する理解が深まったら幸いです。

【読書記録】極楽征夷大将軍

 直木賞を取ったという完全にミーハーな理由で『極楽征夷大将軍』を読んだ。感想文を書こうと思う。

 まず、長さに怯んだ。二段組で550ページ。この長さの本を読むのは久しぶりだった。しかも、読もうと思ったきっかけが直木賞を取ったという完全にミーハーな理由だったから、なおさらだった。

 しかし、読んでみたら面白い。昔、歴史の授業で教わった単語を物語として理解することができる。私はこれまで歴史物はあまり読んでこなかったが、これを機に入門しようと思う。本作は、足利尊氏・直義兄弟の物語なので、室町幕府の歴史全体を俯瞰できるような小説があったら飛びつくと思う。

 さて、本作を読んで私が感じたことは二つ。

 一つは、人間の人生のどうにもならなさである。自分の人生は、自分の力で切り拓いていけると人は考えがちだけれども、実際は周囲の人間関係や世の中のうねりに流されて、思うようにいかない。逆に、自分が力を入れなくても周囲に担ぎ出されて、実力以上の栄華を手にすることもある。

 本作の主人公、足利直義は前者で、尊氏は後者だと思う。また、人生において常にどちらかに属するということはなく、うつろい行くものなのだと思う。私の人生を振り返っても、努力したのに報われなかったこともあるし、大した努力もしていないのに、運が味方をしてくれたときもある。うまくいかないときは、ツキがまわってくるのを待つしかないと諦め、逆にうまくいっているときは調子に乗らないよう自分をいさめると良いのかもしれない。

 もう一つ感じたことは、なんだかんだいって足利尊氏は優秀だったということ。本作では、ポンコツとして描かれる場面が多かったが、尊氏は戦上手であった。また、直義の死後は精力的に政治活動に取り組み、全国の平定に尽力したなど、やはり歴史に名を残しただけのことはある。尊氏は全体を俯瞰して観ることに長けていた。本作ではこの能力が天賦の才として描かれている。正直、そのような能力を持って生まれた尊氏がうらやましい。

 一方で、弟の直義はというと本作では優秀そのものとして描かれている。物事を細分化し、それぞれをきっちり詰めていくことで物事を進めていく。尊氏とは真逆の能力であるが、こちらの能力もうらやましい。

 残念ながら、私には尊氏のような全体を俯瞰して観る力もなければ、直義のように細かいことまできっちり詰めていく力もない。そういった能力がある人が、世の中にはたくさんいるのだから、私のような凡人がなかなか思うように成果をあげられないことは仕方ない。能力を持った人に憧れと嫉妬を持ちながら生きていくしかないのだと思う。

 ここまで色々とネガティブなことも書き連ねてきたが、本作は良い意味で人生に脱力するきっかけを与えてくれた。普段はビジネス書や技術書ばかりを読んで、疲れを感じていたので、たまには小説を読むことも悪くないと思った。

【読書記録】新 企業の研究者をめざす皆さんへ

目次

はじめに

 私事ですが、今年(2023年)の4月にコンサル部門から研究部門に異動になりました。その結果、論文を読んだり、自分でコードを書いたりといった仕事が増えました。私としては、そういった仕事にも取り組んでみたかったので、非常に満足しています。

 その一方で、研究者としてどのようにキャリアを積んでいくべきなのかということを、今時点で考えておくべきだと感じました。そこで、その参考になりそうな本として、本書を読んでみました。

感想

 本書は、企業で研究活動に取り組んでいる人が興味を持つであろう事柄を、7章でまとめています。
 例えば、私は駆け出しの研究者なので、研究者としての心構えについて書かれた第1章「Research That Matters」に特に興味を持ちました。一方で、部下を抱えているマネジメント層の方々は第5章「リーダーシップについて」などに興味を持つのではないかと思います。
 どのような研究者でもそれぞれ自分が興味を持つ章を見つけられることが、本書の特長なのではないかと思います。

 私の場合、研究者としての心構えについて書かれた第1章「Research That Matters」と、研究の進め方について書かれた第2章「研究の営み」を重点的に読みました。

 ここで、本書で何度も繰り返し出てくる言葉「Research That Matters」の意味を明らかにしておこうと思います。本書では「Research That Matters」を次のように説明しています。

企業で行う研究は、その成果が世の中に目に見えるインパクトを与えるべきである。インパクトのある研究、それを私は"Research That Matters"と呼んでいる。「マター」というのは、それによって人が動く、世の中が変わる、という意味である。

 本書では、「Research That Matters」は企業研究者が常に意識すべきことであると述べられています。また、逆に言えば企業ではインパクトのない研究をすべきではないということでもあります。

 それでは、「Research That Matters」を実現するためには、具体的にどのような取り組みをすれば良いのでしょうか?それに対する著者の考えは第2章「研究の営み」に書かれています。著者の考えを図1にまとめました。各取り組みの詳細は本書を読んでいただければと思います。

図1:Research That Mattersを実現するための取り組み例

 私の場合、研究対象において「良い問題を選ぶ」ということがまだできていません。そこで、まず「複数の専門性を持つ」ということを目指そうと思います。

本書を通じて私はどんな実践をするか

 前節で「複数の専門性を持つ」に取り組んでいくと述べました。そのために何をするべきなのかを、先日上司との1on1で相談してみました。上司の答えは、「狭い範囲でも良いから、まずは一つ専門性を持つこと」とのことです。一つの分野を極めれば、勉強の仕方が分かり二つ目、三つ目の専門性を持つことが容易になるとのことでした。

 確かに、現在の自分はこれが自分の専門だ!といえるような分野がありません。また、どうやったら専門性を高められるかといった知見もありません。まずは、一つの分野の勉強を通じて、専門性を高める方法を体得するということが大事なように思います。

 そこで、「研究対象の分野の複数の論文をサーベイし、まとめる」ことを会社での今期の個人目標に設定しました。一つの分野の専門性を持つことの第一歩は、その分野でどのような問題設定がなされており、どのように問題解決がなされているかを知っていることだと今の私は考えています。その第一歩を会社の目標として設定できたことをうれしく思います。

まとめ

 本書では、「Research That Matters」という考え方を中心にして、論が進んでいきました。
 私の場合は、上記を実現するために複数の専門性を持つということを最優先にして取り組んでいきたいと思います。そのために、まずは一つの分野の専門性を高めるための勉強をしていこうと思います。

参考文献

おまけ

 本書は多くの本や論文を引用しています。その中で気になった本がありました。『イノベーション・オブ・ライフ ハーバード・ビジネススクールを巣立つ君たちへ』です。本書は人生における時間の使い方や集中力をどのように投資するかについて、経営学の考え方を用いて説明した本だそうです。時間の使い方に悩んでいる自分にとっては興味のある話題です。次は、この本を読んでみようと思っています。

【読書記録】世界のエリートがやっている最高の休息法

目次

はじめに

 突然ですが、みなさんは元気いっぱいに働いたり、遊んだりできていますか?私はできていないことが多いです。また、会社でも「やる気が出ない」「慢性的に疲れている」と言っている人が多くいます。

 そんなときに、出会った本が『世界のエリートがやっている最高の休息法』です。本書は、脳の疲労を取り除く方法を紹介した本です。本書で紹介された方法を実践することで、多くの人の心身の健康を取り戻すことができれば良いなと思います。

感想

 本書は二部構成の本です。第一部では、脳を休息させる方法として7つの瞑想法が紹介されます。第二部では、第一部で紹介した瞑想の有効性に関する科学的根拠が小説形式で説明されます。

 私は、第一部で紹介されている瞑想を実践することが非常に重要だと思いました。瞑想の方法をいくら頭で理解しても、実践しなければ心身が休まることはないからです。実践がとにかく重要と私は理解しています。

 ちなみに私も瞑想を一週間程度続けていますが、頭がスッキリする感覚があります。ただ単に睡眠をとったり、リラックスするのとは異なる不思議な感覚です。この感覚にハマり、瞑想を続けています。

 本書の第一部から7つの瞑想法の名前と使う場面を表1に引用しました。各瞑想法の詳しいやり方については、本書を読んでいただければと思います。

表1:7つの瞑想
名前 場面
マインドフルネス呼吸法 とにかく脳が疲れているとき
ムーブメント瞑想 気づくと考えごとをしているとき
ブリージング・スペース ストレスで体調がすぐれないとき
モンキーマインド解消法 思考のループから脱したいとき
RAIN 怒りや衝動に流されそうなとき
やさしさのメッタ 他人へのマイナス感情があるとき
ボディスキャン 身体に違和感・痛みがあるとき

本書を通じて私はどんな実践をするか

 とにかく日常に瞑想を取り入れてみようと思います。私の一日で瞑想を取り入れられそうな場面をピックアップし、図1にまとめてみました。意外と色々な場面で瞑想を取り入れられるのだなという風に思っています。

図1:瞑想を取り入れた一日
# 目次

まとめ

 本書は瞑想を通じて脳を休ませる方法を紹介した本です。本書を読み、瞑想を日常に取り入れることで心身の健康を取り戻せる人が増えることを祈っています。

参考文献

【読書記録】数学文章作法

目次

はじめに

 みなさん、文章を書くことは得意でしょうか?私は苦手です。数式やコードが混じった文章を書くことは、特に苦手です。しかし、データサイエンティストという仕事柄、私は数式やコードが混じった文章を書く機会が多くあります。

 そんな苦手感を持っているときに、上司から紹介された本が『数学文章作法』です。本書は、読みやすい文章を書く方法をわかりやすく解説した本です。なお、本書は文章を書く上での基礎をまとめた『基礎編』と、推敲をメイントピックにした『推敲編』の2冊に分かれています。

感想

 本書の特長は、読みやすい文章を書くためのノウハウが豊富に紹介されていることです。本書では、正確で読みやすい文章を書くための原則として「読者のことを考える」ことをあげています。本書で紹介される数々のノウハウは、全てこの原則から導かれたものです。

 例えば『基礎編』の第1章では、読者の知識・意欲・目的を意識して文章を書くべきと教わります。まさに「読者のことを考える」を地でいくような教えだと思います。

 他にも、「数式のエックスはxと書き、xとは書きません」といった形式の話(『基礎編』第2章)や「自分が推敲に使えるのがまとまった時間細切れの時間のどちらであるかを把握しましょう」といった時間の管理術(『推敲編』第7章)など、本書で扱われる話題は非常に幅広いです。『基礎編』と『推敲編』の2冊で、読みやすい文章を書く際に必要な知識を網羅的に身に着けることができます。

 また、本書のもう一つの特長としてノウハウを具体例を通じて学べるということが挙げられます。先ほど例に挙げた第1章での教えは、ただ単に「読者の知識・意欲・目的を意識しましょう」と紋切型の説明があるだけでなく、実際の文章を例にして解説がなされます。

 読みやすい文章を書くための豊富なノウハウを、具体例を通じて学べることが本書の特長といえます。

本書を通じて私はどんな実践をするか

 私は本書で学んだことを、以下のように仕事に役立てようと思います。

  1. 文章を書く前に、書きたいことを構造化してから書く
  2. 文章を書いている最中は、読者が思うことを想定して文章を書く
  3. 文章を書いた後は、『推敲編』の第9章に書かれている推敲のチェックリストを用いて推敲を行う

各項目について、以下で詳細を補足します。

文章を書く前に、書きたいことを構造化してから書く
 文章を書く前に各文章の要点をまとめ、要点同士の関係性を整理してから文章を書こうと思います。それにより、読者が理解しやすい順序で文章を組み立てられると考えています。このことは、『基礎編』の第3章から学びました。

文章を書いている最中は、読者が思うことを想定して文章を書く
 文章を書いている最中は、読者の思いを想像しながら書き進めていこうと思います。例えば、「抽象的な話が続いてきたから、読者は飽きるだろう」と想像し、例を入れるなどの工夫をすることがこれにあたります。このことは、『基礎編』の第1章から学びました。

文章を書いた後は、『推敲編』の第9章に書かれている推敲のチェックリストを用いて推敲を行う
 文章を書いた後は、漫然と推敲をすることは避けるべきです。そのため、推敲の指針として『推敲編』の第9章に書かれているチェックリストを用いようと思います。

まとめ

 本記事では、数式やコードが混じった文章を分かりやすく書くためのノウハウが解説された『数学文章作法』を紹介しました。本書を通じて文章を書くことが苦手な人が一人でも減ると良いなと思っています。

参考文献