ゼロから作るDeep Learning
in R

Japan.R 2022

@igjit

@igjit

最近読んでる本

ディープラーニングの本格的な入門書。 外部のライブラリに頼らずに、 Python 3によって ゼロからディープラーニングを作る ことで、ディープラーニングの原理を楽しく学びます。

https://www.oreilly.co.jp/books/9784873117584/

ディープラーニングの本格的な入門書。 外部のライブラリに頼らずに、 Python 3によって ゼロからディープラーニングを作る ことで、ディープラーニングの原理を楽しく学びます。

じゃあRでもできるんじゃね?

やってみた。

https://igjit.github.io/deep-learning-from-scratch-r/

6章 学習に関するテクニック

の途中までできた。

Q: Rでもゼロからディープラーニングを作れるのか。

A: できそう。

むしろ

Python

import numpy as np

A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
np.dot(A, B)

R

A <- matrix(1:4, 2, byrow = TRUE)
B <- matrix(5:8, 2, byrow = TRUE)
A %*% B

import numpyせずにbaseで行列を計算できるRのほうが 「外部のライブラリに頼らずに」ゼロから作ってると言える。

気づき

オブジェクトシステム

Rではオブジェクトシステムを選べる

  • base R
    • S3
    • S4
    • RC (reference class)
  • CRAN package
    • R6
    • R.oo
    • proto

どれを使うべきかは解きたい問題と好みによる。

私はS3のシンプルさと、それを使った参照透明なコードが好きだけど、

Pythonのミュータブルなオブジェクトを直訳する場合はR6が便利

Python

class SimpleNet:
    def __init__(self, W):
        self.W = W

    def predict(self, x):
        return np.dot(x, self.W)

R (R6Class)

SimpleNet <- R6Class("SimpleNet", list(
  W = NULL,
  initialize = function(W) {
    self$W <- W
  },
  predict = function(x) {
    x %*% self$W
  }))

だいたい同じように書ける。

Advanced Rを読めばすぐにR6を使えるようになるよ。

関数型プログラミング

ニューラルネットワークの伝播

つまりひとつ前の値を使って何かする、をくり返す場合

元のPythonのコード

activations = {}

x = input_data

for i in range(hidden_layer_size):
    if i != 0:
        x = activations[i-1]

    w = np.random.randn(node_num, node_num) * 0.01
    a = np.dot(x, w)
    z = sigmoid(a)

    activations[i] = z

purrr::accumulateで簡潔に書ける

x1 <- input_data

activations <- purrr::accumulate(
  1:hidden_layer_size,
  function(x, i) {
    w <- matrix(rnorm(node_num * node_num), node_num) * 0.01
    a <- x %*% w
    sigmoid(a)
  },
  .init = x1) %>% tail(-1)

配列の初期化、インデックスによるアクセス、条件分岐など、低レベルの処理を書かなくてよくなった。

どう計算するか、ではなく、それが何であるか、を記述できる。

文芸的プログラミング

ゼロから作るDeep Learning in R はQuartoを使って書かれている。

ソースコードはigjit/deep-learning-from-scratch-r

note書いたので読んでね。

まとめ

ゼロから作るDeep LearningをRでやってる

技術書の写経楽しい

プログラミング楽しい

R楽しい

みんなも

Enjoy!

// reveal.js plugins