Курсовая работа: Распознавание слов естественного языка с использованием нейросетей
private double sigmoid(double x)
{ return 1 / (1 + Math.Exp(-x)); }
Однако функция Exp приводит к ошибке в программе, если входное значение выходит из промежутка -39..38. К счастью, эти значения настолько далеко отстоят от начала координат, что мы можем считать: при аргументе < -39 значение функции равно 0, при аргументе > 38, - значение функции равно 1. Для предотвращения ошибки добавим несколько строчек:
private double sigmoid(double x)
{ if (Math.Abs(x) < 38) //проверка условия нахождения функции в интервале -39..38
{ return 1 / (1 + Math.Exp(-x)); }
else
{ if (x >= 38)
{ return 1; }
else { return 0; } } }
Биологические нейроны не срабатывают (не выдают выходной сигнал) до тех пор, пока уровень входного сигнала не достигнет некоторого порогового значения, т.е. на вход нейрона поступает сумма взвешенных сигналов минус некоторая величина. Полученное значение проходит через активационную функцию.
Каждая активность нейрона предыдущего слоя умножается на соответствующий весовой коэффициент, результаты умножения суммируются (1), вычитается пороговое значение, вычисляется значение сигмоидной функции (5). Вот пример на С#:
Вычисление суммы взвешенных сигналов для входного набора данных
private void run_input_layer()
{ double sum = 0;
for (int i = 0; i < MAX_INP; i++)
{ sum = 0;
for (int j = 0; j < MAX_INP; j++)
{ sum = sum + ipl[i].w[j] * test_pat[j];//(1) }
ipl[i].a = sigmoid(sum - ipl[i].threshold);//(5) } }
Вычисление суммы взвешенных сигналов для скрытого и выходного слоев (методы run_hidden_layer и run_output_layer) производится аналогично.
Каждый слой нейронов базируется на выходе предыдущего слоя (за исключением входного слоя, базирующегося непосредственно на предъявляемых сети входных данных (в коде - массив test_pat). Это значит, что значения входного слоя должны быть полностью рассчитаны до вычисления значений скрытого слоя, которые в свою очередь, должны быть рассчитаны до вычисления значений выходного слоя.
Выходы нейронной сети - значения активностей (поле a) нейронов выходного слоя. Программа, симулирующая работу нейронной сети, в процессе обучения будет сравнивать их со значениями, которые должны быть на выходе сети.
Полный алгоритм обучения НС с помощью процедуры обратного распространения строится так:
1. ???????????????? ????????? ???????? ? ??????? ???????????? ?????????? ?????????? ?????????? (?? ????? 0.4). ????????????? ??????? ????????????? ?????????? ????????????? ?????????? ? ??????? ?????? Random ???????????? ? ??????? random_weights.2. Подать на входы сети один из возможных образов и в режиме обычного функционирования НС, когда сигналы распространяются от входов к выходам, рассчитать значения последних. Метод run_the_networ.
3. Вычислить ошибки для выходного слоя (calculate_output_layer_errors). При этом используем формулу (7) для каждого i-ого значения выходного слоя. Ниже представлена соответствующая функция:
private void calculate_output_layer_errors()
{ for (int j = 0; j < MAX_OUT; j++)
{ ol[j].E = (desired[j] - ol[j].a) * ol[j].a * (1 - ol[j].a); } }