Форум программистов, компьютерный форум, киберфорум
C#: ИИ, нейросети, ML, агенты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 16.04.2015
Сообщений: 1

Оптимизация(нахождение минимума) функции для нейронной сети

19.05.2015, 16:10. Показов 1200. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток! Я пишу программу для распознавания рукописных цифр. В ней будет 2058 нейронов и нужно будет найти минимум функция состоящей из переменных в количестве этих нейронов, плюс эта функция состоит из суммы 2000 - 3000 мини-функций(по кол-ву обучающих примеров).
В настоящее время пробую алгоритм градиентного спуска, на немного простой функции - тут 3 перменные и 100 сумм(обучающих примеров). Матрица X(3x100) заполняется из файла.
Так вот вопрос больше не к нейросети, а к оптимизации.
В коде ниже находится минимум примерно 5 минут при более-менее хорошей точности. Что будет по времени на той большой функции - боюсь представить.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
//градиентный спуск
private void button2_Click(object sender, EventArgs e)
        {
            int t = 3;
            double n;
            double eps = 0.01;
            double alpha = 0.2;
            double[] theta = { 0, 0, 0 };
            double[] zn = { };
            double[] N;
            double fun, fun1;
        lb3:
            N = dFpodX(theta);
            n = 0;
            for (i = 0; i < t; i += 1)
            {
                n = n + N[i] * N[i];
            }
            while (Math.Sqrt(n) >= eps)
            {
            lb4:
                fun = func(theta);
                for (i = 0; i < t; i += 1)
                {
                    theta[i] -= alpha * N[i];
                }
 
                fun1 = func(theta);
                if (fun1 > fun)
                {
                    for (i = 0; i < t; i += 1)
                    {
                        theta[i] += alpha * N[i];
                    }
                    alpha = alpha / 2;
                    goto lb4;
                }
                else
                {
                    goto lb3;
                }
            }
            textBox2.Text = Convert.ToString(Math.Round(func(theta), 2));
            textBox3.Text = Convert.ToString(Math.Round(theta[0], 2));
            for (i = 1; i < t; i += 1)
            {
                textBox3.Text = textBox3.Text + "; " + Convert.ToString(Math.Round(theta[i], 2));
            }
        }
 
//функция стоимости
public static double func(double[] theta)
        {
            double func0 = 0;
            double sigm, z, ch1, ch2;
            for (i = 0; i < k; i++)
            {
                z = 0;
                for (j = 0; j < t; j++)
                {
                    z += theta[j] * X[i, j];
                }
                sigm = sigmoid(z);
                ch1 = -znach[i, 2] * Math.Log(sigm);
                ch2 = (1 - znach[i, 2]) * Math.Log(1 - sigm);
                func0 += (ch1 - ch2);
            }
            return func0 / k;
        }
 
//сигмоид для функции стоимости и градиента
static double sigmoid(double z)
        {
            double sig;
            if (z > 35) //без этих ограничений значение сигмоида получается 1 или 0, чего не должно быть
            {
                sig = 0.9999999999999;
            }
            else
            {
                if (z < -709)
                {
                    sig = 0.000000000000001;
                }
                else 
                {
                    sig = 1 / (1 + Math.Exp(-z));
                }
            }
            return sig;
           
        }
 
//градиент функции        
static double[] dFpodX(double[] theta)
        {
            double z, el;
            double[] GR = new double[t];
            for (i = 0; i < k; i++)
            {
                z = 0;
                for (j = 0; j < t; j++)
                {
                    z += theta[j] * X[i, j];
                }
                el = sigmoid(z) - znach[i, 2];
 
 
                for (j = 0; j < t; j++)
                {
                    GR[j] += el * X[i, j];
                }
            }
            for (j = 0; j < t; j++)
            {
                GR[j] = GR[j] / k;
            }
            return GR;
        }
Здесь тот же алгоритм, но функция совсем другая - 5 переменных, но она гораздо проще(ничего в таких масштабах как выше не суммируется). И минимум этой функции находится моментально даже при большей точности
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//градиентный спуск (практически тоже самое, что и код выше)
private void button10_Click(object sender, EventArgs e)
        {
            int t = 5;
            double n;
            double eps = 0.0001;
            double alpha = 0.2;
            double[] theta = { 0, 0, 0, 0, 0 };
            double[] zn = { };
            double[] N;
            double fun, fun1;
        lb1:
            N = dF(theta);
            n = 0;
            for (i = 0; i < t; i += 1)
            {
                n = n + N[i] * N[i];
            }
            while (Math.Sqrt(n) >= eps)
            {
            lb2:
                fun = fu(theta);
                for (i = 0; i < t; i += 1)
                {
                    theta[i] -= alpha * N[i];
                }
 
                fun1 = fu(theta);
                if (fun1 > fun)
                {
                    for (i = 0; i < t; i += 1)
                    {
                        theta[i] += alpha * N[i];
                    }
                    alpha = alpha / 2;
                    goto lb2;
                }
                else
                {
                    goto lb1;
                }
            }
            textBox2.Text = Convert.ToString(Math.Round(fu(theta), 2));
            textBox3.Text = Convert.ToString(Math.Round(theta[0], 2));
            for (i = 1; i < t; i += 1) 
            {
                textBox3.Text = textBox3.Text + "; " + Convert.ToString(Math.Round(theta[i], 2));
            }
        }
 
//функция
double fu(double[] theta)
        {
            return 100 * System.Math.Pow(theta[0] + 3, 4) + 
                         System.Math.Pow(theta[1] - 3, 4) + 
                         System.Math.Pow(theta[2] - 5, 4) + 
                     7 * System.Math.Pow(theta[3] + 5, 4) + 
                     5 * System.Math.Pow(theta[4] - 10, 4);
        }
        
//градиент
double[] dF(double[] theta)
        {
            double[] GR = new double[5];
            GR[0] = 400 * System.Math.Pow(theta[0] + 3, 3);
            GR[1] = 4 * System.Math.Pow(theta[1] - 3, 3);
            GR[2] = 4 * System.Math.Pow(theta[2] - 5, 3);
            GR[3] = 28 * System.Math.Pow(theta[3] + 5, 3);
            GR[4] = 20 * System.Math.Pow(theta[4] - 10, 3);
            return GR;
        }

Не подскажете что можно сделать, что бы минимум функции стоимости моя программа искала быстрее, ведь в дальнейшем функция будет куда крупнее.
Пробовал использовать библиотеку alglib, но из-за static, ничего не считается в этой библиотеке, выводится сразу начальная функция стоимости

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//функция и градиент для библиотеки
public static void function1(double[] theta, ref double func1, double[] grad, object obj)
        {
            func1 = func(theta);
            grad = dFpodX(theta);
        }
      
//Библиотека
private void button13_Click(object sender, EventArgs e)
        {
            double[] x = new double[] { 5, 4, 3 };
            double epsg = 0.0000000001;
            double epsf = 0;
            double epsx = 0;
            int maxits = 0;
            alglib.minlbfgsstate state;
            alglib.minlbfgsreport rep;
 
            alglib.minlbfgscreate(1, x, out state);
            alglib.minlbfgssetcond(state, epsg, epsf, epsx, maxits);
            alglib.minlbfgsoptimize(state, function1, null, null);
            alglib.minlbfgsresults(state, out x, out rep);
 
            textBox2.Text = Convert.ToString(rep.terminationtype);
            textBox3.Text = Convert.ToString(alglib.ap.format(x, 2));
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.05.2015, 16:10
Ответы с готовыми решениями:

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода
MATLAB только начал осваивать. Попытался реализовать нахождение точки минимума методом Ньютона для функции 2*X12 - X1*X2 + 3*X22 -...

Нахождение минимума функции
Суть проблемы: первоначально набирается некая функция, зависящая от 5 переменных(от 5 ячеек excel'a), затем по команде макроса находятся...

Нахождение минимума функции
Помогите,пожалуйста.Не могу найти минимум функции

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.05.2015, 16:10
Помогаю со студенческими работами здесь

Нахождение минимума функции
Добрый день! Столкнулся с проблемой при работе: Есть некая степенная функция от одной переменной (остальные заданы численно) типа...

Нахождение минимума функции
Нужно найти минимум без использования fminbnd функции y=x/lnx, вот что у меня получилось, но в командном окне не выводится ответ, что...

Нахождение минимума функции
Надо на VB найти минимум функции y=f(x)

Нахождение минимума/максимума функции
Была написана программа с использованием утилиты GUIDE. Пользовательский интерфейс выглядит так: ...

Метод Оптимизации, нахождение минимума функции
Нужно найти производную ,приравнять её к нулю и найти минимум функции и сам аргумент. %Приведем пример расчета максимальной...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru