신경망 지금 이해하고 있는게 맞는지...

Lightstar의 이미지

지금 신경망 학습을 하고 있는데 생각이랑 다른 결과가 나옵니다.
-1과 1사이로 스케일링한 데이터를 100개를 1 셋트로 보고
50세트를 한번씩 학습 시킵니다.
목표데이터는 0.2 0.7 2개 입니다.

0.184615 0.262500 0.783333 0.483333 0.315077 0.27789 ... 100개 학습데이터 1번째
목표데이터 결과 0.5 0.56

0.153846 0.245833 0.772222 0.377778 0.396308 0.3677 ... 100개 학습데이터 2번째
목표데이터 결과 0.4 0.58

...

... 100개 학습데이터 100번째
목표데이터 결과 0.24 0.645

이렇게 데이터를 학습시킬 때마다 목표데이터에 가까운 결과는 나옵니다.

학습데이터는 어떤 특징이 있게 나열된 값입니다.
그럼 이렇게 학습된 신경망에 특징이 학습데이터와는 전혀 다른 값들을 넣습니다.

0.8 0.8 0.8 0.8 0.9 0.001 0.001 0.001 ... 100개 테스트데이터

이 값을 저 학습된 신경망에 나오면 결과는 학습 목표 결과인 0.2, 0.7이 아닌(마지막으로 나온 목표데이터 결과인 0.24, 0.645와는 동떨어진) 엉뚱한 값이 나올 줄 알았습니다.

0.8 0.4 가 나온다던지...

그런데 아무리 엉뚱한 값을 집어넣어도 마지막 목표데이터인 0.24 0.645와 같은 값이 나옵니다.
원래 이런건가요? 신경망 설계가 잘못된 건가요?

제가 하려는건
신경망 2개를 학습시켜서
특정 데이터셋을 2개의 신경망에 모두 집어넣습니다.
그렇게 되면 하나의 신경망은 이런 데이터셋에 적합하게 학습되었고 예상하던 값이랑 비슷하게 출력할 것이고
다른 신경망은 엉뚱한 데이터가 들어와서 학습된 결과값이랑 다른 값을 출력할 것이라고 생각했습니다.

그런데 특정데이터셋에 학습된 신경망 임에도 불구하고 아무값이나 들어와도 학습된 결과와 같게 내보내네요..
지금 어떤 오류가 있는건가요?

익명 사용자의 이미지

입력단의 숫자가 적다면 color map으로 그려보세요.. 출력값을 color값으로 해서.. 그러면 구현하신 신경망의 판별능력이 보일겁니다...

일단 마지막 값과 비슷한 값이 나온다는 걸로 봐서는 over learning된것 같습니다. 100개 정도의 자료에 over되었다는건, 학습 계수가 너무 높거나 문제에 비해 레이어가 너무 단순하거나 뭐 그럴겁니다...
아시겠지만 over learning되면 이전에 배웠던걸 잊어버립니다.. 사람의 뇌와 유사하죠.. 그래서 사람의 뇌는 3-4세 이상이 되면 부분적으로 추가 학습을 막는 기능이 발동한다고 어디서 봤던 거 같네요..

둘 다 아니라면, 문제 자체를 인간의 눈으로 잘 분석해 보세요.. 구분 가능한 자료인지.. 정말 판별이 안되는 자료일수도 있겠죠..

jick의 이미지

음 저도 신경망에 대해 잘 모르니까 헛소리일 수도 있습니다만...

학습을 하실 때에는 오로지 "A와 같은 형태의 데이터가 들어오면 x라는 결과값을 내라"를 학습시킨 것 아닌가요?

그렇다면 기계 입장에선 "A와 *다른* 형태의 데이터가 들어오면 x와 *다른* 결과값을 내라"라는 학습을 받은 적이 한 번도 없으니, 무슨 값을 내든 학습을 시킨 사람이 할 말이 없죠.

Lightstar의 이미지

질문글 처음 올릴 때 문제는 해결됬습니다.
학습반복수를 조절하니까 되더군요.
그래서 지금 출력 패턴을 더 다양하게 하고 다시 돌리는데 같은 문제가 발생했습니다.
100개 데이터 100셋트 10 패턴

위에는 패턴 두개만 비교했는데 패턴 10개로 늘렸습니다.

지금 조절할 수 있는건 학습 반복수, 학습 가중치, 은닉 뉴런수인데 아무리 조절해도 안되길래 은닉층 수를 늘려주려고 합니다.
웬만해선 층 1개로도 된다고 하는데... 은닉층 수 늘려주는 방법도 알 겸 해보려고하는데 샘플은 전부 입력층1, 은닉층1, 출력층1이네요.
은닉 뉴런을 늘린다는건 알겠는데 은닉층 수를 늘리는건 코딩으로 어떻게 표현되는건가요?

gilgil의 이미지

데브피아에 글 올리신 분이신 것 같네요.
http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=50&MAEULNO=20&no=941387&ref=941387

다시 말씀드리지만, 이건 질문하신 내용만으로는 답할 수가 없습니다.

1. back propagation을 위해 어떠한 sigmoid 함수를 사용했느냐?
2. 학습와 관성 계수를 얼마로 했느냐(관성 계수가 달라 지면 학습 횟수가 달라 질 수도 있음)?
3. 학습 패턴을 어떻게 학습시켰느냐(전체 패턴을 반복해서 학습? 아니면 특정 패턴을 반복 학습시킨 이후 다른 패턴을 반복 학습)?
4. neuron의 구성을 어떻게 했느냐?

input, hidden, output layer 3계층만 가지고는 해결되지 않는 경우가 많습니다.
이러한 경우 hidden layer를 다계층으로 두어서 해결되는 경우도 있습니다.

Lightstar의 이미지

지금 계속해서 보고있는데 과잉학습이 문제가 되는 것같습니다.
패턴 하나를 학습 시킬 때는 제대로 되는데 다른 패턴을 학습시키면 이전 패턴을 자꾸 잊습니다.

5개의 패턴을 번갈아가면서 서로 다른 데이터 100개로 학습시켜서 전부 학습 성공하는 것 까지는 됬는데 패턴이 10개가 넘어가니까 못 학습하는 패턴들이 생기네요.

그리고 한번씩 번갈아가면서 학습시키는게 이전에 학습된 연결가중치를 바로 다음에 다른 패턴학습 시 변경한다는게 문제가 되는 것 같아서 한 패턴씩 완벽히 학습 시키고 다른 패턴을 학습시키는 방법으로 해보려고 하는데 그냥 다 잊어먹네요...

시그모이드 함수는 단극성을 사용했고 학습 가중치는 0.007에서 계속 바꿔주면서 테스트 중입니다.
3번은 지금 막 제가 해서 다시 이 글 올리려고 하는 본문 내용이군요.
전체를 반복해서 하니까 5개의 패턴까지는 되는데... 그 이상은 안됩니다... 하나씩 학습시키면 어김없이 그 전 패턴을 잊어먹구요;;

은닉층의 뉴런수는 아무리 늘려줘도 안되고 그래서 위 댓글과 같이 은닉층의 개수를 늘려주려고 하는데 어떻게 코딩 해줘야 할지 모르겠습니다.

gilgil의 이미지

> 패턴 하나를 학습 시킬 때는 제대로 되는데 다른 패턴을 학습시키면 이전 패턴을 자꾸 잊습니다.
neural network가 너무 단순해서 그렇습니다. 3계층으로는 xor과 같은 문제를 해결할 수 있는 정도일 뿐이지, 복잡한 입력과 출력에 대해서 그 기억을 모두 다 할 수 있을 것이라고 생각하면 안됩니다.

> 전체를 반복해서 하니까 5개의 패턴까지는 되는데... 그 이상은 안됩니다... 하나씩 학습시키면 어김없이 그 전 패턴을 잊어먹구요;;
최신의 것만 학습시키면 예전 것은 잊어 먹게 마련입니다. 사람도 마찬가지입니다. 어릴 때 암기해 놓은 것 반복해서 상기시키지 않으면 잊어 버리게 되죠.
neuron간의 계수(강도)는 최근에 "기억해라"라고 명령하는 것(back propagation)을 중점적으로 기억(변화)하려고 합니다.

> 은닉층의 뉴런수는 아무리 늘려줘도 안되고 그래서 위 댓글과 같이 은닉층의 개수를 늘려주려고 하는데 어떻게 코딩 해줘야 할지 모르겠습니다.
neuron과 neuron 사이를 linked list와 같은 형식으로 연결하지 않았나요? hidden layer의 neuron 갯수를 늘려 주는 것보다 hidden layer 자체를 multi-layer으로 구성해 보라는 얘기입니다.

익명 사용자의 이미지

첫번째 댓글 단 사람인데.. 코딩문제는 실제적으로 코드를 보지 않은이상 어떻게 하시라 말씀 못드립니다. 코드를 올리셔도 제 경우엔 제 코드도 보기 싫어 땡땡이 치는 와중에 남 코드를 보고 싶지는 않을거구요..

다만 멀티 레이어 관련해서 사족을 달면..

앞서 그래프로 그려보라는 말씀을 드렸었는데, 실제로 그려보면 레이어의 은닉층 수가 신경망에 어떤 영향을 주는지 잘 보입니다.. 은닉층 수가 적으면 단조로운 직선의 조합이 되지만 은닉층 추가 많으면 다수의 직선이 중첩된 복잡한 형태가 됩니다.. 전에 어떤 논문에서 기가막힌 그림을 봤었는데 못찾겠네요..

그런데 너무 많은 은닉층이 있으면 필요이상으로 복잡한 모양이 되어 오히려 정확도가 떨어집니다. 대충 감으로 말씀드리면 은닉층 수가 많으면 95%까지는 쭉 올라가다가 그 벽을 못깨는 거지요.. 이때 그래프로 그려보면 직선으로 분류하면 깔끔한 부분을 이상한 곡선이 삐뚤빼뚤 억지로 맞춰져 있는걸 볼수 있습니다.
그럴 때는 오히려 은닉층 수를 줄이면 더 정확할 수도 있습니다.
요컨대, 신경망은 손쉬운 학습 알고리즘을 제공하지만 만능은 아니고, 실용적으로 사용하려면 결국 선험적인 도메인 자료 분석이 필요합니다.. 아니면 인류처럼 수백만년 자연선택에 노출시키든가요..

질문하신분 상황에서는 좀 많이 앞선 이야기 일텐데, 나중에라도 도움이 될까해서 써봅니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.