rumale 0.15.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -0
- data/lib/rumale.rb +1 -0
- data/lib/rumale/neural_network/adam.rb +75 -0
- data/lib/rumale/neural_network/base_mlp.rb +21 -18
- data/lib/rumale/neural_network/mlp_classifier.rb +3 -2
- data/lib/rumale/neural_network/mlp_regressor.rb +3 -2
- data/lib/rumale/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e97522eaf22db6c80513f8d69513b6aef7dc1a9f
|
4
|
+
data.tar.gz: a2c2d51a15465f5bac67bc0b60aef1c70067bba4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b04158c2f4247c58593dad54e1d8c79030aff2a3826032610b9d7afee73490843caa3c5636c86fc3fc3196ed45affdb2da17c7d926091f77c784f1970464c2a4
|
7
|
+
data.tar.gz: e75814bcbe3aa087f2a45a15790a180016147d9197442d5d329a6484d1baee8b4d2726265d640a3d47ada45189d6dfb3157f2fa5eec7e334824cf96bd8fba493
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
# 0.16.0
|
2
|
+
## Breaking changes
|
3
|
+
- The meaning of the `max_iter` parameter of the multi-layer perceptron estimators
|
4
|
+
has been changed from the maximum number of iterations to the number of epochs.
|
5
|
+
The number of epochs is how many times the whole data is given to the training process.
|
6
|
+
As a future plan, similar changes will be applied to other estimators used stochastic gradient descent such as SVC and Lasso.
|
7
|
+
- [MLPClassifier](https://yoshoku.github.io/rumale/doc/Rumale/NeuralNetwork/MLPClassifier.html)
|
8
|
+
- [MLPRegressor](https://yoshoku.github.io/rumale/doc/Rumale/NeuralNetwork/MLPRegressor.html)
|
9
|
+
|
1
10
|
# 0.15.0
|
2
11
|
- Add feature extractor classes:
|
3
12
|
- [HashVectorizer](https://yoshoku.github.io/rumale/doc/Rumale/FeatureExtraction/HashVectorizer.html)
|
data/lib/rumale.rb
CHANGED
@@ -74,6 +74,7 @@ require 'rumale/decomposition/factor_analysis'
|
|
74
74
|
require 'rumale/decomposition/fast_ica'
|
75
75
|
require 'rumale/manifold/tsne'
|
76
76
|
require 'rumale/manifold/mds'
|
77
|
+
require 'rumale/neural_network/adam'
|
77
78
|
require 'rumale/neural_network/base_mlp'
|
78
79
|
require 'rumale/neural_network/mlp_regressor'
|
79
80
|
require 'rumale/neural_network/mlp_classifier'
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rumale/base/base_estimator'
|
4
|
+
|
5
|
+
module Rumale
|
6
|
+
module NeuralNetwork
|
7
|
+
# @!visibility private
|
8
|
+
# This module consists of the classes that implement optimizers adaptively tuning learning rate.
|
9
|
+
module Optimizer
|
10
|
+
# @!visibility private
|
11
|
+
# Adam is a class that implements Adam optimizer.
|
12
|
+
#
|
13
|
+
# *Reference*
|
14
|
+
# - D P. Kingma and J. Ba, "Adam: A Method for Stochastic Optimization," Proc. ICLR'15, 2015.
|
15
|
+
class Adam
|
16
|
+
include Base::BaseEstimator
|
17
|
+
|
18
|
+
# @!visibility private
|
19
|
+
# Create a new optimizer with Adam
|
20
|
+
#
|
21
|
+
# @param learning_rate [Float] The initial value of learning rate.
|
22
|
+
# @param decay1 [Float] The smoothing parameter for the first moment.
|
23
|
+
# @param decay2 [Float] The smoothing parameter for the second moment.
|
24
|
+
def initialize(learning_rate: 0.001, decay1: 0.9, decay2: 0.999)
|
25
|
+
@params = {}
|
26
|
+
@params[:learning_rate] = learning_rate
|
27
|
+
@params[:decay1] = decay1
|
28
|
+
@params[:decay2] = decay2
|
29
|
+
@fst_moment = nil
|
30
|
+
@sec_moment = nil
|
31
|
+
@iter = 0
|
32
|
+
end
|
33
|
+
|
34
|
+
# @!visibility private
|
35
|
+
# Calculate the updated weight with Nadam adaptive learning rate.
|
36
|
+
#
|
37
|
+
# @param weight [Numo::DFloat] (shape: [n_features]) The weight to be updated.
|
38
|
+
# @param gradient [Numo::DFloat] (shape: [n_features]) The gradient for updating the weight.
|
39
|
+
# @return [Numo::DFloat] (shape: [n_feautres]) The updated weight.
|
40
|
+
def call(weight, gradient)
|
41
|
+
@fst_moment ||= Numo::DFloat.zeros(weight.shape)
|
42
|
+
@sec_moment ||= Numo::DFloat.zeros(weight.shape)
|
43
|
+
|
44
|
+
@iter += 1
|
45
|
+
|
46
|
+
@fst_moment = @params[:decay1] * @fst_moment + (1.0 - @params[:decay1]) * gradient
|
47
|
+
@sec_moment = @params[:decay2] * @sec_moment + (1.0 - @params[:decay2]) * gradient**2
|
48
|
+
nm_fst_moment = @fst_moment / (1.0 - @params[:decay1]**@iter)
|
49
|
+
nm_sec_moment = @sec_moment / (1.0 - @params[:decay2]**@iter)
|
50
|
+
|
51
|
+
weight - @params[:learning_rate] * nm_fst_moment / (nm_sec_moment**0.5 + 1e-8)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Dump marshal data.
|
55
|
+
# @return [Hash] The marshal data.
|
56
|
+
# def marshal_dump
|
57
|
+
# { params: @params,
|
58
|
+
# fst_moment: @fst_moment,
|
59
|
+
# sec_moment: @sec_moment,
|
60
|
+
# iter: @iter }
|
61
|
+
# end
|
62
|
+
|
63
|
+
# Load marshal data.
|
64
|
+
# @return [nil]
|
65
|
+
# def marshal_load(obj)
|
66
|
+
# @params = obj[:params]
|
67
|
+
# @fst_moment = obj[:fst_moment]
|
68
|
+
# @sec_moment = obj[:sec_moment]
|
69
|
+
# @iter = obj[:iter]
|
70
|
+
# nil
|
71
|
+
# end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -177,13 +177,14 @@ module Rumale
|
|
177
177
|
# @param learning_rate [Float] The initial value of learning rate in Adam optimizer.
|
178
178
|
# @param decay1 [Float] The smoothing parameter for the first moment in Adam optimizer.
|
179
179
|
# @param decay2 [Float] The smoothing parameter for the second moment in Adam optimizer.
|
180
|
-
# @param max_iter [Integer] The maximum number of
|
180
|
+
# @param max_iter [Integer] The maximum number of epochs that indicates
|
181
|
+
# how many times the whole data is given to the training process.
|
181
182
|
# @param batch_size [Intger] The size of the mini batches.
|
182
183
|
# @param tol [Float] The tolerance of loss for terminating optimization.
|
183
184
|
# @param verbose [Boolean] The flag indicating whether to output loss during iteration.
|
184
185
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
185
186
|
def initialize(hidden_units: [128, 128], dropout_rate: 0.4, learning_rate: 0.001, decay1: 0.9, decay2: 0.999,
|
186
|
-
max_iter:
|
187
|
+
max_iter: 200, batch_size: 50, tol: 1e-4, verbose: false, random_seed: nil)
|
187
188
|
@params = {}
|
188
189
|
@params[:hidden_units] = hidden_units
|
189
190
|
@params[:dropout_rate] = dropout_rate
|
@@ -203,7 +204,9 @@ module Rumale
|
|
203
204
|
private
|
204
205
|
|
205
206
|
def buld_network(n_inputs, n_outputs, srng = nil)
|
206
|
-
adam = Rumale::Optimizer::Adam.new(
|
207
|
+
adam = Rumale::NeuralNetwork::Optimizer::Adam.new(
|
208
|
+
learning_rate: @params[:learning_rate], decay1: @params[:decay1], decay2: @params[:decay2]
|
209
|
+
)
|
207
210
|
model = Model::Sequential.new
|
208
211
|
n_units = [n_inputs, *@params[:hidden_units]]
|
209
212
|
n_units.each_cons(2) do |n_in, n_out|
|
@@ -216,25 +219,25 @@ module Rumale
|
|
216
219
|
|
217
220
|
def train(x, y, network, loss_func, srng = nil)
|
218
221
|
class_name = self.class.to_s.split('::').last
|
219
|
-
|
220
222
|
n_samples = x.shape[0]
|
221
|
-
rand_ids = [*0...n_samples].shuffle(random: srng)
|
222
223
|
|
223
224
|
@params[:max_iter].times do |t|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
225
|
+
sample_ids = [*0...n_samples]
|
226
|
+
sample_ids.shuffle!(random: srng)
|
227
|
+
until (subset_ids = sample_ids.shift(@params[:batch_size])).empty?
|
228
|
+
# random sampling
|
229
|
+
sub_x = x[subset_ids, true].dup
|
230
|
+
sub_y = y[subset_ids, true].dup
|
231
|
+
# forward
|
232
|
+
out, backward = network.forward(sub_x)
|
233
|
+
# calc loss function
|
234
|
+
loss, dout = loss_func.call(out, sub_y)
|
235
|
+
break if loss < @params[:tol]
|
236
|
+
# backward
|
237
|
+
backward.call(dout)
|
238
|
+
end
|
233
239
|
@n_iter = t + 1
|
234
|
-
puts "[#{class_name}] Loss after #{@n_iter}
|
235
|
-
break if loss < @params[:tol]
|
236
|
-
# backward
|
237
|
-
backward.call(dout)
|
240
|
+
puts "[#{class_name}] Loss after #{@n_iter} epochs: #{loss}" if @params[:verbose]
|
238
241
|
end
|
239
242
|
|
240
243
|
network
|
@@ -40,13 +40,14 @@ module Rumale
|
|
40
40
|
# @param learning_rate [Float] The initial value of learning rate in Adam optimizer.
|
41
41
|
# @param decay1 [Float] The smoothing parameter for the first moment in Adam optimizer.
|
42
42
|
# @param decay2 [Float] The smoothing parameter for the second moment in Adam optimizer.
|
43
|
-
# @param max_iter [Integer] The maximum number of
|
43
|
+
# @param max_iter [Integer] The maximum number of epochs that indicates
|
44
|
+
# how many times the whole data is given to the training process.
|
44
45
|
# @param batch_size [Intger] The size of the mini batches.
|
45
46
|
# @param tol [Float] The tolerance of loss for terminating optimization.
|
46
47
|
# @param verbose [Boolean] The flag indicating whether to output loss during iteration.
|
47
48
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
48
49
|
def initialize(hidden_units: [128, 128], dropout_rate: 0.4, learning_rate: 0.001, decay1: 0.9, decay2: 0.999,
|
49
|
-
max_iter:
|
50
|
+
max_iter: 200, batch_size: 50, tol: 1e-4, verbose: false, random_seed: nil)
|
50
51
|
check_params_type(Array, hidden_units: hidden_units)
|
51
52
|
check_params_numeric(dropout_rate: dropout_rate, learning_rate: learning_rate, decay1: decay1, decay2: decay2,
|
52
53
|
max_iter: max_iter, batch_size: batch_size, tol: tol)
|
@@ -35,13 +35,14 @@ module Rumale
|
|
35
35
|
# @param learning_rate [Float] The initial value of learning rate in Adam optimizer.
|
36
36
|
# @param decay1 [Float] The smoothing parameter for the first moment in Adam optimizer.
|
37
37
|
# @param decay2 [Float] The smoothing parameter for the second moment in Adam optimizer.
|
38
|
-
# @param max_iter [Integer] The maximum number of
|
38
|
+
# @param max_iter [Integer] The maximum number of epochs that indicates
|
39
|
+
# how many times the whole data is given to the training process.
|
39
40
|
# @param batch_size [Intger] The size of the mini batches.
|
40
41
|
# @param tol [Float] The tolerance of loss for terminating optimization.
|
41
42
|
# @param verbose [Boolean] The flag indicating whether to output loss during iteration.
|
42
43
|
# @param random_seed [Integer] The seed value using to initialize the random generator.
|
43
44
|
def initialize(hidden_units: [128, 128], dropout_rate: 0.4, learning_rate: 0.001, decay1: 0.9, decay2: 0.999,
|
44
|
-
max_iter:
|
45
|
+
max_iter: 200, batch_size: 50, tol: 1e-4, verbose: false, random_seed: nil)
|
45
46
|
check_params_type(Array, hidden_units: hidden_units)
|
46
47
|
check_params_numeric(dropout_rate: dropout_rate, learning_rate: learning_rate, decay1: decay1, decay2: decay2,
|
47
48
|
max_iter: max_iter, batch_size: batch_size, tol: tol)
|
data/lib/rumale/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rumale
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- yoshoku
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-01-
|
11
|
+
date: 2020-01-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: numo-narray
|
@@ -233,6 +233,7 @@ files:
|
|
233
233
|
- lib/rumale/nearest_neighbors/k_neighbors_classifier.rb
|
234
234
|
- lib/rumale/nearest_neighbors/k_neighbors_regressor.rb
|
235
235
|
- lib/rumale/nearest_neighbors/vp_tree.rb
|
236
|
+
- lib/rumale/neural_network/adam.rb
|
236
237
|
- lib/rumale/neural_network/base_mlp.rb
|
237
238
|
- lib/rumale/neural_network/mlp_classifier.rb
|
238
239
|
- lib/rumale/neural_network/mlp_regressor.rb
|