Как использовать персептрон с сигмоидальным и стохастическим градиентным спуском? - PullRequest
0 голосов
/ 15 апреля 2019

Я - самообучающаяся нейронная сеть, и я начинаю с перцептрона, и я внедряю ее с нуля, используя python и обучая модель с помощью данных рака молочной железы из sklearn, но средние затраты на модели для каждой эпохи / итерации не сходятся к нулю и сохраняются.средняя постоянная стоимости, и модель не предсказывает правильно, как ожидалось.

Я пытаюсь использовать метод сигмоидного и стохастического градиентного спуска на нем, и я обнаружил, что в Интернете есть немного ресурсов, которые пробуют то, что япытаюсь сейчас (извините, если есть еще что-то, чего я не знаю).

Вот код модуля перцептрона:

import numpy

class Perceptron:
    value = 0.0
    total_sum = 0.0

    def __init__(self, inputs, weights):
      self.total_sum = inputs * weights[1:] + weights[0]
      self.value = 1 / (1 + numpy.exp(-self.total_sum))


def sigmoid_derivative_of_intercept(sigmoid_value):
    return sigmoid_value * (1 - sigmoid_value)


def sigmoid_derivative_of_slope(input_x, total_sum, sigmoid_value):
    return input_x.sum() * numpy.exp(-total_sum) * sigmoid_value**2

Пояснения к этим производным

assumed cost function of the perceptron is (target - predict) = c(w, b)

let sum(wx + b) = total_sum
let weight[0] += learning_rate * -d(c)/d(b)
let weights[1:] += learning_rate * -d(c)/d(w)
let predict = 1 / (1 + e^(-total_sum))

d(c)/d(b)
  = d(target - predict)/d(b)
  = -d(predict)/d(b)
  = -d(1 / (1 + e^(-total_sum)))/d(b)
  = -e^(-total_sum) / (1 + e^(-total_sum))^2
  = -predict * (1 - predict)

the part where predict * (1 - predict) is for the intercept or bias and minus sign are already cancle out with the weight update formula

d(c)/d(w)
  = -d(predict)/d(w)
  = -d(1 / (1 + e^(-total_sum)))/d(w)
  = -d(1 / (1 + e^(-sum(wx + b))))/d(w)
  = -sum(x)e^(-total_sum) / (1 + e^(-total_sum))^2
  = -sum(x) * e^(-total_sum) * predict^2

Процесс подбора

import numpy
import pandas
import matplotlib
imoprt sklearn.datasets as sklearn_datasets
import sklearn.preprocessing as sklearn_preprocessing

# the module or the percetron class above
import perceptron.core as perceptron_core

dataset = sklearn_datasets.load_breast_cancer()

training_data_len_as_percentage = 80
training_data_len = training_data_len_as_percentage * dataset.data.shape[0] / 100

training_data = sklearn_proprocessing.minmax_scale(dataset.data[:training_data_len])
training_target = dataset.target[:training_data_len]

threshold = 10000
bias = 1.0
learning_rate = 0.01
weights = numpy.random.uniform(low=0.0, high=1.0, size=(training_data_len + 1))

average_errors = []

for _ in range(threshold):
    total_error_in_one_epoch = 0.0

    # NOTE: for stochastic gradient descent
    # the method saids to update weight each training data
    for n in range(training_data_len):
        predict = perceptron_core.Perceptron(training_data[n], weights)
        error = training_target[n] - predict.value

        total_error_in_one_epoch += error

        weights[0] += learning_rate * perceptron_core.sigmoid_derivative_of_intercept(predict.value)
        weights[1:] += learning_rate * perceptron_core.sigmoid_derivative_of_slope(training_data[n], predict.total_sum, predict.value)

    average_errors.append(total_error_in_one_epoch / training_data_len)

График средней стоимости выглядит следующим образом:

average cost chart

Прогноз был неверным.Для остальных данных в качестве тестового набора все прогнозы предсказывают одно и то же значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...