Инициализация веса градиентного спутника [дубликат]

== выполняет контрольную проверку равенства, ссылаясь на то, что 2 объекта (строки в этом случае) относятся к одному и тому же объекту в памяти.

Метод equals() будет проверять, будет ли содержимое или состояния двух объектов одинаковы.

Очевидно, что == работает быстрее, но во многих случаях может (может) давать ложные результаты, если вы просто хотите сказать, имеет ли 2 String s тот же текст.

Определенно рекомендуется использовать метод equals().

Не беспокойтесь о производительности. Некоторые способы поощрения использования String.equals():

  1. Реализация String.equals() сначала проверяет ссылочное равенство (используя ==), и если две строки одинаковы по ссылке, дальнейший расчет Выполняется!
  2. Если 2 ссылки на строки не совпадают, String.equals() будет проверять длину строк. Это также является быстрой операцией, поскольку класс String хранит длину строки, не нужно считать символы или кодовые точки. Если длины отличаются, дальнейшая проверка не выполняется, мы знаем, что они не могут быть равными.
  3. Только если мы доберемся до этого, будет фактически сопоставлено содержимое двух строк, и это будет короткий сравнение: не все символы будут сравниваться, если мы найдем несоответствующий символ (в том же положении в 2 строках), никакие другие символы не будут проверены.

Когда все сказано и даже если у нас есть гарантия, что строки являются стажерами, использование метода equals() все еще не является издержками, которые можно было бы подумать, определенно рекомендуемым способом. Если вам нужна эффективная проверка ссылок, используйте перечисления, где гарантируется спецификацией и реализацией языка, что одно и то же значение перечисления будет одним и тем же объектом (по ссылке).

71
задан kmario23 30 December 2017 в 10:38
поделиться

3 ответа

Здесь важна разрывная симметрия, а не причина производительности. Представьте сначала два слоя многослойного персептрона (входные и скрытые слои):

enter image description here [/g0]

При прямом распространении каждый блок в скрытом слое получает сигнал:

enter image description here [/g1]

То есть каждый скрытый блок получает сумму входов, умноженную на соответствующий вес.

Теперь представьте, что вы инициализируете все веса до одного значения (например, ноль или один). В этом случае каждый скрытый блок получит точно такой же сигнал. Например. если все веса инициализированы до 1, каждый блок получает сигнал, равный сумме входов (и выходов sigmoid(sum(inputs))). Если все веса - это нули, что еще хуже, каждый скрытый блок получит нулевой сигнал. Независимо от того, какой был вход - если все веса одинаковы, все единицы в скрытом слое будут одинаковыми.

Это основная проблема с симметрией и причиной, почему вы должны инициализировать весы случайным образом (или, по крайней мере, с разными значениями). Обратите внимание, что эта проблема затрагивает все архитектуры, которые используют каждое подключение к каждому.

90
ответ дан Community 16 August 2018 в 12:33
поделиться
  • 1
    Отличное объяснение. Но зачем использовать слово symmetry not correlation? Кто первым использовал это слово? – nn0p 1 April 2016 в 14:46
  • 2
    @ nn0p: корреляция подразумевает, что 2 сигнала изменяются в аналогичном направлении, но не всегда и не с точно такой же величиной. По крайней мере, насколько я знаю, симметрия не имеет формального определения и используется здесь для представления точно тех же сигналов по всем ссылкам между узлами, что делает тренировку бесполезной. – ffriend 1 April 2016 в 23:45
  • 3
    @ffriend, чем в случае использования исключения, рандомизация не нужна. Я ошибаюсь? – emanuele 28 June 2016 в 23:53
  • 4
    @emanuele Dropout - это своего рода рандомизация, поэтому да, это должно сработать. Тем не менее, все соединения, которые не «выпадали», на каждой итерации все равно будет получать симметричное обновление, поэтому я думаю, что обучение будет довольно медленным и, следовательно, порекомендует использовать случайную инициализацию в любой практической сети. – ffriend 1 July 2016 в 23:20

Аналогия:

Надеюсь, это хорошая аналогия. Я попытался объяснить это как можно проще.

Представьте, что кто-то сбросил вас с вертолета на неизвестную вершину горы, и вы оказались там в ловушке. Везде туман. Единственное, что вы знаете, это то, что вы должны как-то подняться на уровень моря. Какое направление вы должны предпринять, чтобы перейти к наименьшей возможной точке?

Если вы не смогли найти путь к уровню моря, и поэтому вертолет возьмет вас снова и бросит вас на ту же самую вершину горы должность. Вам придется снова взять те же самые направления, потому что вы «инициализируете» себя на одинаковые стартовые позиции.

Однако, каждый раз, когда вертолет бросает вас куда-то случайным на гору, вы должны принимать разные направления и шаги. Таким образом, у вас будет больше шансов достичь наименьшей возможной точки.

Это то, что подразумевается под словом симметрии. Инициализация асимметрична (, которая отличается ), поэтому вы можете найти разные решения для одной и той же проблемы.

В этой аналогии, где вы приземляетесь, это веса. Таким образом, с разным весом есть больше шансов добраться до самой низкой ( или нижней ) точки.

Кроме того, она увеличивает энтропию в системе, чтобы система могла создавать больше информация, которая поможет вам найти нижние точки ( локальные или глобальные минимумы ).

36
ответ дан Inanc Gumus 16 August 2018 в 12:33
поделиться
  • 1
    отличная аналогия !! – Munai Das Udasin 3 December 2016 в 02:22
  • 2
    спасибо! @MunaiDasUdasin – Inanc Gumus 3 December 2016 в 10:16
  • 3
    Отличное объяснение !! Thnx – user3304797 1 March 2017 в 16:26
  • 4
    @ user3304797 np thx! – Inanc Gumus 1 March 2017 в 16:45
  • 5
    Похоже, что вертолет несколько раз выпадает вам где-то случайно на гору, однако в глубоком обучении мы просто начинаем весы случайным образом только один раз. – YuFeng Shen 24 October 2017 в 09:04

Ответ довольно прост. Основные алгоритмы обучения являются жадными по своей природе - они не находят глобального оптимального, а скорее - «ближайшего» локального решения. В результате, начиная с любой фиксированной инициализации, вы отклоняете свое решение по отношению к определенному набору весов. Если вы делаете это случайным образом (и, возможно, много раз), гораздо менее вероятно, что вы застрянете в какой-то странной части поверхности ошибки.

Тот же аргумент применяется к другим алгоритмам, которые не способны найти глобальный оптимум (k-mean, EM и т. д.) и не относится к глобальным методам оптимизации (например, SMO-алгоритму для SVM).

24
ответ дан lejlot 16 August 2018 в 12:33
поделиться
  • 1
    Таким образом, не гарантируется, что он не застрянет в локальных минимумах, просто рандомизировав? Но после нескольких запусков с различными рандомизированными весами он может получить глобальный минимум? – Shayan RC 18 November 2013 в 05:57
  • 2
    Нет никакой гарантии, но несколько инициализаций могут помочь, по крайней мере, приблизиться к истинному оптимуму. – lejlot 18 November 2013 в 09:35
  • 3
    Есть ли стандартная формула или правило для установки значения для инициализации весов? У меня есть волоконно-оптическая сеть с обратной связью, многослойная, где используется сигмоидальная функция. – lkkkk 30 October 2014 в 06:54
  • 4
    существует некоторое правило большого пальца в книге С. Хайкина «нейронные сети», – lejlot 30 October 2014 в 08:33
  • 5
    Это не причина, по которой люди используют случайную инициализацию, поскольку большинство людей не перезапускают обучение много раз с разными случайными инициализациями, и сеть все еще может получить хорошие локальные оптимумы. – cesarsalgado 10 December 2015 в 00:11
Другие вопросы по тегам:

Похожие вопросы: