24 1월 2025

[ 一日30分 인생승리의 학습법] 기술부채(Technical Debt)는 소프트웨어 개발이나 프로젝트 과정에서, 약속된 것과 실제로 제공된 것 사이에 차이가 발생하는 것을 의미합니다. 

[ 一日30分 인생승리의 학습법] 기술부채(Technical Debt)는 소프트웨어 개발이나 프로젝트 과정에서, 약속된 것과 실제로 제공된 것 사이에 차이가 발생하는 것을 의미합니다. 

 

기술부채(Technical Debt)는 소프트웨어 개발이나 프로젝트 과정에서, 약속된 것과 실제로 제공된 것 사이에 차이가 발생하는 것을 의미합니다. 즉, 기술적으로 해결해야 할 문제를 미루고 비즈니스 문제를 해결하는 것을 말합니다.

기술부채는 금전적인 채무와 비슷한 개념으로, 언젠가는 이자와 함께 상환해야 합니다. 기술부채가 쌓이면 개발 속도가 느려지고, 고객은 수정되지 않은 결함으로 인해 피해를 볼 수 있습니다.

기술부채를 최소화하기 위해서는 다음과 같은 방법을 고려할 수 있습니다.

  • 프로젝트 초기부터 적절한 기술 선택과 설계를 수행합니다
  • 코드 품질 관리를 합니다
  • 충분한 테스트를 수행합니다
  • 지속적인 개선과 리팩토링을 수행합니다
  • 기술 부채를 적극적으로 모니터링하고, 적절한 대응 전략을 수립합니다

2025-01-23-01 기술부채 01 DALL·E 2025-01-23 18.46.37 - A conceptual illustration of technical debt in software development. The image should depict a software engineer climbing a mountain made of messy cod.png

기술 부채(Technical Debt)란?

글쓴이 권오륜 / 2023년 06월 27일

 

기술 부채의 정의


 

사전적인 정의는 다음과 같습니다.

 

현 시점에서 더 오래 소요될 수 있는 더 나은 접근방식을 사용하는 대신 쉬운(제한된) 솔루션을 채택함으로써 발생되는 추가적인 재작업의 비용을 반영하는 소프트웨어 개발의 한 관점이다.

기술 부채는 금전적인 채무와 비유될 수 있다.

– 위키백과

출처 입력

워드 커닝햄(Ward Cunningham) 이 1992년도에 사용한 표현으로, 소프트웨어 개발에서 빠른 개발이나 기능 출시를 위해 나중에 처리하도록 미루어진 기술적인 문제를 말합니다. 이러한 문제들은 나중에 수정되어야 하지만, 미뤄진 만큼 처리하기에 더욱 복잡하고 비용이 많이 들어가게 됩니다.

결국, 나중에 개발해야 만 하는 추가적인 작업 형태로 남아 마치 갚아야 할 부채처럼 된다는 것입니다.

 

평균적인 소프트웨어 개발자는 기술 부채를 처리하는 데 일주일에 13시간 이상을 쓴다.

– 2018년 스트라이프(Stripe)의 Developer Coefficient 보고서

출처 입력

이와 같이 기술 부채를 관리하는데, 많은 시간을 투입해야 하는 것으로 나타났으며, 시스템이나 애플리케이션이 복잡하고, 커질수록 더욱 많은 시간을 투입해야 합니다.

이외에도, 마틴 파울러는 2009년 그의 블로그에서 기술 부채 사분면을 제시하였으며, 소프트웨어 개발 과정에서 “빠른 구현” 이라는 효과는 나타낼 수도 있지만 결국에는 “유지보수 노력 증가”라는 대가를 치루게 된다는 점을 설명하면서, 기술 부채의 중요성을 강조하고 있습니다.

02. 기술부채 -image-10.png

마틴 파울러의 기술 부채 사분 (https://www.productplan.com/glossary/technical-debt/)

 

기술 부채의 종류


 

기술 부채는 다양한 형태로 나타날 수 있으며, 예를 들어, 설계 부채, 코드 부채, 테스트 부채, 인프라 부채 등이 있습니다.

설계 부채

  • 소프트웨어 설계 단계에서 적절한 설계를 제대로 수행하지 않았거나 설계 결함을 미처 수정하지 못하여 생기는 부채
  • 소프트웨어의 설계가 미흡하거나 부적절하게 이루어졌을 때, 나중에 해당 소프트웨어를 수정하거나 유지 보수하는 과정에서 발생하는 추가적인 비용과 시간

코드 부채

  • 개발자가 프로그램 코드를 작성할 때, 시간이나 예산 등의 제한으로 인해 충분한 품질을 보장하지 못하고 미루는 코드 작성 작업
  • 소프트웨어 개발의 초기 단계에서는 효과적으로 비용을 절감할 수 있지만, 이후에 시스템을 유지 보수/업그레이드/기능 추가 시 많은 비용과 시간이 들어감

테스트 부채

  • 소프트웨어 개발 과정에서 충분한 테스트를 수행하지 않아 생기는 부채
  • 시스템의 기능이나 성능을 충분히 검증하지 않거나, 불완전한 테스트를 수행하여 발견하지 못한 결함으로 인해 시스템이나 소프트웨어의 품질 저하되며, 이후 품질 향상을 위해 많은 비용과 시간이 들어감

인프라 부채

  • 소프트웨어 개발 및 운영을 위한 인프라 구성에 대한 부채
  • 개발자가 시스템 운영을 위한 서버나 DB 등의 인프라 구성을 미리 준비하지 않은 채 개발을 진행하여, 시스템의 초기 버전은 빠르게 출시할 수 있지만, 이후 시스템 규모가 확장되거나 사용자 수가 증가하면 인프라 구성이 부족한 상황이 발생하게 되어, 시스템의 성능 저하나 서버 다운 등의 문제가 발생

기술 부채의 원인


 

기술적인 결함

  • 시스템/소프트웨어 대한 적절하지 않은 설계 또는 코드의 품질 관리를 하지 않는 등의 이유

시간 및 예산 제약

  • 개발 프로젝트의 일정이 매우 촉박하거나, 예산이 제한되어 있는 경우 개발자들은 충분한 테스트나 코드 리팩토링을 수행하지 않아 발생

기술적인 부족함

  • 새로운 기술을 익히는데 시간이 부족한 경우나, 충분한 경험이 없는 경우 발생 가능성이 높음

업무 환경

  • 개발 프로젝트를 위한 업무 환경이 부적절하거나, 커뮤니케이션에 문제가 있어 일부 정보나 요구사항을 놓치는 경우

이외에도 업무 우선순위, 기술적인 한계 등 여러 원인이 있을 수 있습니다.

기술 부채 최소화하는 방안


 

코드 리뷰

  • 다른 개발자들이 작성한 코드를 검토하고, 잠재적인 기술 부채를 예방할 수 있음
  • 코드의 가독성, 유지보수성, 확장성 등을 개선하고, 문제가 발생했을 때 빠르게 대처할 수 있도록 도와줌

테스트 자동화

  • 개발자가 작성한 코드를 자동으로 검증하고, 문제를 미리 파악할 수 있음
  • 잠재적인 기술 부채를 미리 예방할 수 있으며, 개발자가 코드를 수정하거나 추가할 때마다 자동으로 테스트가 수행되므로 코드의 신뢰성을 높일 수 있음

지속적인 통합/배포

  • 코드 변경 사항을 빠르게 반영하고, 문제를 빠르게 파악하고 해결할 수 있음
  • 개발자들은 코드 변경에 대한 실시간 피드백을 받으므로, 문제가 발생했을 때 빠르게 대처할 수 있음

기술 부채 관리

  • 기술 부채를 발생시키는 원인을 파악하고, 관리할 수 있는 프로세스를 도입하여 최소화할 수 있음
  • 기술 부채를 쌓이지 않도록 예방하고, 발생했을 때는 빠르게 대처하여 안정적인 소프트웨어 개발을 진행할 수 있도록 노력해야 함

최신 기술 도입

  • 새로운 기술이 나올 때마다 최신 기술을 도입하여 기술 부채를 최소화할 수 있음
  • 최신 기술을 도입하면 개발 시간이 단축되고, 더욱 효율적으로 개발할 수 있음

기술 부채를 최소화하기 위해서는 프로젝트 초기부터 적절한 기술 선택과 설계, 코드 품질 관리, 충분한 테스트, 그리고 지속적인 개선과 리팩토링을 수행해야 합니다. 또한, 기술 부채를 적극적으로 모니터링하고, 적절한 대응 전략을 수립하여 신속하게 해결하는 것이 필요합니다. 이러한 노력을 통해 기술 부채를 최소화하고, 높은 품질과 안정성을 갖춘 소프트웨어를 개발하는 것이 가능합니다.

기술 부채 관리의 중요성


 

기술 부채는 소프트웨어 개발 프로젝트에서 매우 중요한 문제이며, 기술 부채가 높아질수록 프로젝트 진행에 대한 위험이 높아질 수 있습니다.

높은 기술 부채는 미래에 프로젝트를 더욱 복잡하게 만들어서, 수정과 유지 보수 비용이 늘어날 수 있으며, 회사와 고객에게 추가적인 비용과 불편함을 초래할 수 있습니다. 또한, 품질이 낮아질 가능성이 높아져서, 불편한 사용자 경험과 기능 오류를 초래할 수 있습니다.

따라서, 기술 부채를 적절하게 관리하고 최소화하는 것이 매우 중요합니다. 기술 부채를 관리함으로써, 프로젝트의 일정과 예산을 준수하는 데 도움을 주며, 프로젝트의 품질과 안정성을 유지하는 데에도 중요합니다. 또한, 기술 부채를 최소화하면 개발자들은 보다 많은 시간과 에너지를 현재의 개발 과제에 집중할 수 있으며, 개발자들의 생산성과 만족도를 높이는데 도움을 줍니다.

마치며 …


 

기술 부채는 피할 수 없는 것이며, 모든 조직에서 발생할 수 있는 문제입니다.

개발자들은 기술 부채에 대한 인식을 높이고, 팀 전체적으로 기술 부채를 예방하고 관리할 수 잇는 문화를 구축해야 할 것입니다.

팀내에서도 기술 부채를 관리하고 있는지에 대해 한번쯤 검토해 보아야 할 것이며, 저희가 개발하고 있는 제품/서비스를 지속적으로 발전해나가려면, 기술 부채들을 조금씩은 해소해나가면서 개발 진행할 수 있도록 해야할 것입니다.

기술 부채를 최소화하기 위한 방안 및 프로세스 개선에 대해서도 본부 차원에서 고민해봐야 할 문제로 보입니다.

관련 기사


 
  • https://melv1n.com/what-is-technical-debt/
  • https://namu.wiki/w/기술적 부채
  • https://www.itworld.co.kr/insider/238829
  • https://yozm.wishket.com/magazine/detail/1331/
  • https://www.bzpp.co.kr/viewplus/viewplus/ST170328A00001
  • https://www.2e.co.kr/news/articleView.html?idxno=207765
  • https://giljae.com/2022/08/08/기술-부채의-유형과-관리-방법.html

[출처] https://tech.hancom.com/2023-06-27-technical-debt/

 
한컴테크한컴테크를 통해 한컴의 기술을 공유합니다. 한컴의 프로그래밍, 프레임워크, 라이브러리 및 도구 등 다양한 기술을 만나보세요. 한컴 개발자들의 다양한 지식을 회사라는 울타리를 넘어 여러분과 공유합니다. 한컴이 제공하는 기술블로그에서 새로운 아이디어와 도전을 마주하고, 개발자가 꿈꾸는 미래를 실현하세요.

tech.hancom.com

 
 
 

 

Loading

3 1월 2025

[알아봅시다] 세상에서 가장 재미있는 과학 시상식…2024 이그노벨상

[알아봅시다] 세상에서 가장 재미있는 과학 시상식…2024 이그노벨상

세상에서 가장 재미있는 과학 시상식…2024 이그노벨상

입력
2024 Ig Nobel 제공

2024 Ig Nobel 제공

● 드디어 돌아왔다! 이그노벨상 현장 시상식

“무엇보다 안전이 중요합니다. 비상구 위치를 확인하고 당신이 아이가 아니라면 다른 사람 위에 앉지 마세요. 오리에게 먹이를 주거나 오리를 쫓아다니거나 오리를 먹지 마세요. 자 그럼 이제 34번째 이그노벨 시상식을 시작하겠습니다.”

9월 12일 미국 매사추세츠공대의 한 강의실에서 키이스 뮬러 박사가 34번째 이그노벨 시상식 개최를 알렸습니다. 뮬러는 2003년에 죽은 청둥오리 연구로 이그노벨 생물학상을 받은 수상자예요. 이그노벨상은 매년 가을 노벨상 발표 2주전에 열리는 특별한 시상식으로 미국 유머과학잡지 ‘기발한 연구 회보’에서 만들었습니다.

카이스 뮬러 박사. 2024 Ig Nobel 제공

카이스 뮬러 박사. 2024 Ig Nobel 제공

이그노벨상은 매년 사람들을 웃게 하고 그다음에 생각하게 만드는 연구를 선정해 상을 줍니다. 이그노벨상의 창시자인 마크 에이브러햄스는 위대한 연구도 처음에는 무시당하거나 우습게 여겨졌던 경우가 있다는 사실에 주목했어요.

실제로 안드레 가임 영국 맨체스터대 교수는 2000년에 이그노벨상을 받은 뒤 2010년에 노벨물리학상을 받았습니다. 이그노벨상은 개구리 공중부양 연구로, 노벨상은 그래핀 연구로 받은 거긴 하지만요.

노벨과 이그노벨의 다른점. 어린이과학동아 제공

노벨과 이그노벨의 다른점. 어린이과학동아 제공

이그노벨 시상식은 매년 주제를 정해서 진행됩니다. 올해 시상식 주제는 머피의 법칙이었어요. 머피의 법칙은 ‘잘못될 만한 일이 있다면 그 일은 반드시 잘못된다’는 뜻의 심리학 용어입니다. 이전 수상자들이 24초 동안 머피의 법칙과 관련된 개념을 설명한 뒤 딱 7개의 단어로 요약하는 ’24/7’ 강연을 진행했어요. 24초를 넘기면 가차없이 말을 끊어 웃음을 자아냈습니다.

2024 이그노벨 트로피 - 상금(약 530원)과 함께 전달된 트로피. 머피의 법칙과 관련있을 수도 있는 물건이 든 투명한 상자다. 열리지는 않는다. 2024 Ig Nobel 제공

2024 이그노벨 트로피 – 상금(약 530원)과 함께 전달된 트로피. 머피의 법칙과 관련있을 수도 있는 물건이 든 투명한 상자다. 열리지는 않는다. 2024 Ig Nobel 제공

또 올해의 트로피는 ‘머피의 법칙과 관련이 있을 수도 있는’ 물건이 담긴 플라스틱 상자였는데 누군가 시상 후 무대에 놓고 가버리는 바람에 진행자가 범인찾기에 나서기도 했습니다. 상품이 마음에 안 들어도 피할 수는 없었답니다.

죽은 송어보다 살아있는 송어가 더 많이 움직인다는 내용의 물리학상, 부작용이 심한 가짜약이 부작용이 없는 가짜약보다 효과적이라는 내용의 의학상 등 기발한 연구로 가득했던 2024 이그노벨상 수상 연구들을 지금부터 소개합니다.

○ 2024 이그노벨상 통계학상. 동전 350757번 던지고 알아낸 것은?

● 몸으로 확인한 동전 던지기 가설

동전을 던져 앞면이 나올 확률은 얼마일까요. 미국의 수학자 디아코니스가 세운 가설에 따르면 동전이 시작 면과 같은 면으로 떨어질 확률은 다른 면으로 떨어질 확률보다 약간 높아요. 하지만 이 가설이 아직 증명되지는 않았습니다.

프란티셰크 바르토시 네덜란드 암스테르담대 심리학적방법론 박사과정생은 직접 동전을 수십만 번 던져서 가설을 확인하기로 했어요. 충분한 데이터를 모으기 위해 바르토시는 친구들을 모아 동전 던지기 마라톤을 여러 차례 열었습니다.

총 48명이 참여해 81일 동안 650시간 동전 던지기를 한 결과, 처음 위로 향했던 면이 1% 정도 더 많이 나온다는 걸 알아냈다. 2024 Ig Nobel, Frantisek Bartos 제공

총 48명이 참여해 81일 동안 650시간 동전 던지기를 한 결과, 처음 위로 향했던 면이 1% 정도 더 많이 나온다는 걸 알아냈다. 2024 Ig Nobel, Frantisek Bartos 제공

48명이 35만757번 동전을 던진 결과 처음 면과 같은 면이 나올 확률은 50.8%였습니다. 현실에서 동전을 던질 때 앞면이나 뒷면이 나올 확률은 완전히 무작위하지 않고 처음 보였던 면이 다시 나오는 경우가 조금 더 자주 있는 거예요.

연구팀은 공중에 던진 동전이 완벽하게 돌지 않고 약간 비틀리면서 돌아서 이론적인 확률에 딱 떨어지지 않는 것으로 추정했습니다. 바르토시는 “이 연구가 일상에 특별히 변화를 불러오진 않을 것”이라면서도 “미세한 물리 법칙이 우리에게 영향을 미친다는사실을 보여준다”고 말했습니다.

○ 2024 이그노벨상 해부학상. 가마 방향은 태풍의 영향을 받을 수도 있지만, 아마 아닐 것이다” – 로만 콘사리

사람의 정수리를 보면 머리카락이 양쪽으로 나뉘는 지점이 있는데 이를 ‘가마’라고 합니다. 로만 콘사리 프랑스 파리시립대 의대 교수팀의 연구 결과에 따르면 북반구 사람들의 가마는 시계 방향으로 남반구 사람들의 가마 방향은 반시계 방향으로 회전하는 경향이 있습니다.

콘사리는 사람들의 가마 방향이 다른 이유에 태풍과 같은 환경적 요인이 있을 수도 있다고 설명하다가 이렇게 덧붙였어요. “하지만 사실 그럴 가능성은 거의 없습니다.” 도대체 무슨 의미일까요.

2024 Ig Nobel 제공

2024 Ig Nobel 제공

Q. 수상 소식을 듣고 기분이 어떠셨나요.

“팀원들이 많이 생각났어요. 이 연구를 하는 동안 병원의 동료들이 우리 팀을 많이 놀렸거든요. 그런데 이렇게 인정받아 무척 자랑스러웠죠.”

Q. 왜 사람의 가마 방향을 연구하게 됐나요.

“환자의 머리를 수술하면서 가마를 자주 봐요.몇몇 유전 질환은 머리카락의 방향이랑 관련이 있거든요. 그런데 어느 날 동료인 윌렘스 박사의 쌍둥이 딸들의 가마가 같은 방향인 것을 보고 가마 방향이 유전적인 영향을 받는지 환경적 영향을 받는지 궁금해졌어요.”

가마 연구자. Roman Khonsari 제공

가마 연구자. Roman Khonsari 제공

Q.”태풍이 가마 방향과 관련있을 수도 있지만 아마 아닐 것”이라고 하신 이유는 뭔가요.

“태풍의 방향은 지구 자전에 영향을 받아요. 물체가 회전할 때 작용하는 힘을 ‘코리올리힘’이라고 하는데 지구가 자전하면서 생긴 코리올리힘이 바람이나 해류의 방향을 결정하죠. 저희는 남반구와 북반구 사람들의 가마 방향이 다른 이유에 환경적 요인이 있을 수 있다고 짐작했어요.

하지만 코리올리힘은 대규모 환경에서 작동하는 것이라 세포 수준의 사건에는 거의 영향을 미치지 않아요. 그러니까 이 가설이 맞을 가능성은 거의 없죠. 하지만 모든 발견에는 고유한 가치가 있답니다.”

○ 2024 이그노벨상 화학상. “술취한 벌레보다 맨정신인 벌레가 빠르다” – 앙투안 드블레

앙투안 드블레 네덜란드 암스테르담대 물리학과 교수팀은 술이 생물의 움직임에 미치는 영향을 알아내기 위해 독특한 실험을 설계했습니다. 술에 취한 벌레와 맨정신인 벌레에게 달리기를 시킨 결과 맨정신인 벌레가 훨씬 빨랐어요. 연구팀은 술취한 벌레의 활동성이 맨정신인 벌레보다 떨어진다고 설명했습니다.

술 취한 벌레 경주를 실험하는 모습. 2024 Ig Nobel, Antoine Deblais 제공

술 취한 벌레 경주를 실험하는 모습. 2024 Ig Nobel, Antoine Deblais 제공

Q. 이 연구 결과엔 어떤 의미가 있을까요.

“친구들과 경주한다고 생각해 보세요. 어떤 친구는 빨리 뛰고, 또 어떤 친구는 천천히 걸어요. 이 연구에서 벌레들은 달리기 선수들이에요. 우리는 벌레들을 술에 취하게 한 뒤 그들이 어떻게 움직이는지를 관찰했어요.

이를 통해 우리는 스스로 움직일 수 있는 것들이 어떻게 행동하는지 또 이런 움직임이 자연에서 어떻게 적용되는지에 대한 아이디어를 얻었어요. 물고기 떼나 새 떼가 어떻게 함께 움직이는지 이해하는 데도 쓰일 수 있죠. 그래서 과학적으로 아주 중요한 연구입니다.”

Q. 이그노벨상은 과학자에게 어떤 상인가요.

“이그노벨상은 과학의 창의성을 기념하는 상이에요. 연구가 재미있을 수 있다는 걸 상기시켜 주고 과학이 모두에게 열려 있다는 점을 다시 한번 생각하게 해요. 때로는 웃을 수 있는 연구가 중요한 발견으로 이어질 수도 있다는 사실을 보여주기도 합니다.”

Q. 이그노벨상을 꿈꾸는 어린이들에게 조언을 해주신다면.

“과학이 누구에게나 열려있다는 사실을 기억하세요. 여러분이 어리든 대학에 다니든 말든 상관없어요. 우리 연구팀의 테스는 23살 학생인데 집에서 대부분의 실험을 했어요. 항상 호기심을 유지하고 엉뚱해 보이는 질문도 두려워하지 마세요. 계속해서 실험하고 과학을 즐기다 보면 여러분의 실험이 이그노벨상을 받을 날이 올지도 몰라요.”

관련기사
어린이과학동아 11월 1일, 2024 이그노벨상. 세상에서 가장 재미있는 과학 시상식

Loading

29 12월 2024

“돈 너무 많이 든다”오픈AI, 지배구조전면 개편 하기로 – 오픈AI, 결국 투자 친화적 기업으로 전환…지배 구조 바꾼다

“돈 너무 많이 든다”오픈AI, 지배구조전면 개편 하기로

– 오픈AI, 결국 투자 친화적 기업으로 전환…지배 구조 바꾼다

오픈AI, 결국 투자 친화적 기업으로 전환…지배 구조 바꾼다

01. VPDXYJO57JHMRN6WDYUQS2VWTQ.png
 
지난 5월 미국 시애틀에서 열린 마이크로소프트의 연례 개발자 회의 ‘빌드’에서 연설하는 샘 올트먼 오픈AI 최고경영자. /AFP 연합뉴스

세계에 생성 인공지능(AI) 열풍을 불러일으킨 챗GPT 개발사 오픈AI가 수익성을 강화하는 방향으로 지배 구조를 전격 개편한다. 오픈AI는 “상상보다 더 많은 자본을 모으는 것”을 개편 이유로 들었다.

27일 오픈AI는 자사 블로그를 통해 비영리 이사회의 통제를 받는 기존의 영리 자회사 법인을 보통 주식(ordinary shares of stock)을 보유한 공익법인(Public Benefit Corporation, PBC)으로 전환하는 방안을 검토하고 있다고 밝혔다. 앞서 오픈AI는 ‘안전한 AI’를 목표로 내걸고 2015년 비영리법인으로 시작했다.

오픈AI는 지배 구조 개편이 필요한 이유로 ‘자금 조달’을 들었다. 오픈AI는 “주요 기업들이 현재 AI 개발에 수천억 달러를 투자하고 있는 상황은 오픈AI가 사명을 계속 추구하기 위해 실제로 무엇이 필요한지를 보여준다”며 “우리는 다시 한번 상상했던 것보다 더 많은 자본을 조달해야 한다. (지배 구조 개편을 통해) 경쟁사들처럼 필요한 자본을 조달할 수 있게 될 것”이라고 밝혔다.

02. BOA3GNBLYRECPNAAPGOH4QEYRI.png
그래픽=김하경

현재 오픈AI는 복잡한 구조를 갖고 있다. 2015년 설립된 오픈AI는 비영리법인으로 시작해 이사회의 통제를 받고 있다. 하지만 AI 모델을 훈련하기 위해 대규모 자금이 필요하자 2019년 손자회사로 ‘오픈AI 글로벌’이라는 영리법인을 설립했다. 실제 AI 모델을 개발하고 사업화를 담당하는 회사다.

명목은 ‘영리법인’이지만 오픈AI 글로벌은 ‘이익제한기업(Capped profit company)’이라는 독특한 구조를 갖고 있다. 주요 의사 결정은 모회사인 ‘오픈AI 지주회사’가 내리고 수익은 원금의 100배로 제한돼 있다. 상한선을 초과하는 이익은 비영리법인에 귀속돼 오픈AI가 지향하는 인류 전체의 이익을 위해 사용된다.

오픈AI은 이같은 수익 제한 원칙이 투자금을 제한할 수 있다고 보는 것으로 알려졌다. 실제 지난 10월 오픈AI는 66억 달러(약 9조 7416억원) 규모의 투자를 유치했는데 당시 투자자들은 오픈AI에 2년 이내에 회사가 현재의 수익 제한을 풀지 못하면 자금을 회수할 수 있다는 조건을 내건 것으로 알려졌다.

이 때문에 오픈AI는 ‘투자 친화적’인 기업으로 전환을 위해 현재의 영리 법인을 보통 주식을 보유한 PBC로 전환한다는 계획이다. PBC는 사회에 공헌하는 목표를 갖고 있으면서도 이익을 추구할 수 있는 형태의 구조다. 오픈AI의 대항마로 평가받는 AI 스타트업 앤스로픽과 일론 머스크 테슬라 최고경영자(CEO)가 소유한 AI 기업 xAI도 이와 유사한 구조라고 로이터 통신은 전했다.

오픈AI는 “(개편을 통해) 상업적 운영을 추진할 수 있다”며 “그러면서도 비영리 부문을 위해 직원을 별도로 고용하고 이 부문이 의료, 교육, 과학 분야에서 자선 활동을 맡을 수 있게 하겠다”고 밝혔다.

다만 오픈AI의 이같은 계획이 순조롭게 이뤄질지는 미지수다. 오픈AI의 공동창립자이자 현재는 샘 올트먼 오픈AI CEO와 대립각을 세우고 있는 머스크가 앞장서서 이를 반대하고 있기 때문이다. 그는 지난달 29일 캘리포니아 북부 지방법원에 오픈AI 영리법인 전환을 막아달라며 가처분 신청서를 제출했다. 머스크 CEO는 “(오픈AI가 초래할 위협을 막기 위해선) 오픈AI의 비영리적 성격을 보존하게 하는 가처분 명령이 유일한 구체책”이라고 주장했다.

여기에 페이스북 모회사 메타의 마크 저커버그 CEO도 가세하고 나섰다. 메타는 지난 12일 캘리포니아주 법무장관에게 보낸 서한에서 “자선단체로서 비영리 혜택을 누린 뒤 영리 목적으로 전환하는 것은 불법”이라며 오픈AI의 영리법인 전환을 저지해줄 것을 요청했다.

03. https___author-service-images-prod-us-east-1.publishing.aws.arc.pub_chosun_5cb5aa01-8c49-4412-a702-6debe77b0fd3.png
편집국 테크부 기자

[출처] https://www.chosun.com/economy/tech_it/2024/12/28/B4NFVKBRYVETZH4PEPRUMSIAOI/

Loading

28 12월 2024

[ 一日30分 인생승리의 학습법] 고가용성(High Availability) 시스템을 위한 5가지 전략

[ 一日30分 인생승리의 학습법] 고가용성(High Availability) 시스템을 위한 5가지 전략

고가용성(High Availability) 시스템을 위한 5가지 전략

5가지 전략으로 마스터하는 MSA의 고가용성 실전 가이드

Introduction

고가용성, 보통 HA(High Availability)라고 많이들 부를 텐데요. 비즈니스가 잘 되기 시작하면서 대용량 트래픽을 뒷받침할 요소들을 넣다보면 가용성에 대한 고민이 깊어질 수밖에 없어집니다. 특히 마이크로서비스 아키텍처(MSA)를 설계할 때 많은 소프트웨어 엔지니어들이 고민하는 부분이 바로 이 고가용성인데요. 서비스 간의 느슨한 결합과 독립적인 배포라는 MSA의 장점을 살리면서도 시스템 전체의 안정성과 가용성을 확보하는 것이 쉽지 않은 과제이기 때문입니다. 이번에 소개해 드릴 글은 System Design Codex의 “5 Strategies for High-Availability Systems”라는 제목의 글로, 고가용성 시스템을 설계하는 데 도움이 될 만한 5가지 핵심 전략을 다루고 있습니다.


가용성(Availability)은 사용자 경험에 있어 매우 중요합니다. 매 분마다 비행기가 이륙하고 착륙하는 바쁜 공항을 운영하고 있다고 가정해봅시다. 우리가 가장 원하지 않는 것은 관제탑이 고장 나서 혼란과 지연이 일어나는 것일 겁니다.

이와 비슷하게, 24시간 온라인 서비스가 제공되는 시대에 고가용성은 일종의 성배와도 같게 되었습니다. 여러분이 주말에 친구 및 가족과 하이킹을 갈 때조차도 시스템은 항상 작동하고 운영되도록 보장해야 합니다.

그렇다면, 이를 어떻게 해야 할까요? 당연히 여러분은 휴가나 가족과의 시간을 망치고 싶지 않겠죠. 그러니 시스템의 고가용성을 확보하기 위한 몇 가지 전략을 적용해야 합니다.

아래에 소개한 5가지 중요한 전략을 살펴보겠습니다.

1. 로드 밸런싱(Load Balancing, LB)

다시 공항 예시로 돌아가보죠. 우리의 시스템이 바쁜 공항이고, 들어오는 리퀘스트가 착륙을 요청하는 비행기와 같다고 가정해 봅시다. 그런데 활주로가 단 2개밖에 없다면 어떨까요?

바로 이때 관제사가 해야 할 일은 비행기를 다른 활주로로 유도하고, 각 활주로의 부하를 관리하며, 혼잡을 야기하지 않으면서 교통량을 계속 처리하는 것일 겁니다.

로드 밸런서는 곧 애플리케이션의 항공교통관제사와 같습니다. 로드 밸런서는 CPU 사용률, 메모리 사용량, 응답 시간 등 여러 요소를 분석하여 요청을 가장 가용성이 높고 응답성이 좋은 서버로 라우팅합니다. 부하를 분산시킴으로써 단일 서버가 과부하되는 것을 방지하여 피크 부하 시에도 원활한 운영 흐름을 보장합니다.

01 image.png

2. 격리를 통한 데이터 복제(Data Redundancy with Isolation)

만약 특정 노선의 비행기에 문제가 생겨 운항할 수 없게 되면 어떻게 될까요? 탁월한 고객 서비스를 제공하는 효율적인 항공사를 운영하고 있다면, 승객들을 목적지까지 데려다 줄 예비 항공기를 갖추고 있을 것입니다.

애플리케이션의 데이터 복제도 마찬가지입니다. 여기서 데이터 복제(Redundancy, 혹은 Replication)란, 여러 데이터 센터나 클라우드 리전(region)에 걸쳐 데이터의 복사본을 여러 개 저장하는 것을 포함합니다.이렇게 하면 한 데이터 센터에서 장애나 중단이 발생하더라도 사용자는 다른 위치에서 데이터에 계속 엑세스할 수 있습니다.

데이터베이스 복제, 객체 스토리지, 분산 파일 시스템은 바로 데이터 복제를 구현하는 데 일반적으로 사용되는 기술입니다.

02 image.png

3. 장애 조치(Failover)

스카이다이빙을 하러 갔다고 해봅시다. 땅으로 떨어지는 와중에 등에 매달린 유일한 낙하산에 결함이 있다는 것을 깨달은 적이 있나요? (아마도 그렇지 않겠지만) 만약 그런 상황이라면 쉽게 펼칠 수 있는 보조 낙하산이 있기를 간절히 바랄 테죠. 시스템 설계의 맥락에서 장애 조치(Failover)는 그 낙하산과 같습니다.

장애 조치란 주요 구성 요소가 실패할 때, 시스템이나 서비스를 주요 구성 요소에서 대기 또는 백업 구성 요소로 자동 전환하는 것을 의미합니다. 이는 네트워크 트래픽을 백업 서버로 전송하거나, 보조 데이터베이스로 전환하거나, 사용자를 미러링된 애플리케이션 인스턴스로 리디렉션하는 것을 포함할 수 있습니다.

장애 조치 메커니즘은 일반적으로 로드 밸런서, 애플리케이션 서버 및 데이터베이스 관리 시스템에 내장되어 있어 사용자의 가동 중단 시간을 최소화하면서 신속한 전환을 보장합니다.

03.png

4. 오토 스케일링(Auto scailing)

고가용성 관점에서 오토 스케일링은 전투 시나리오의 요구 사항에 따라 추진력을 조정할 수 있는 강력한 전투기에 비유할 수 있습니다.

시스템 설계에서 이 전략은 현재 부하 및 사용 패턴에 따라 컴퓨팅 자원(가상 머신, 컨테이너 또는 서버리스 기능 등)을 동적으로 할당하거나 할당 해제하는 것을 뜻합니다.

오토 스케일링은 CPU 사용률, 메모리 사용량 또는 들어오는 요청 비율과 같은 메트릭에 의해 트리거될 수 있으며, 종종 클라우드 플랫폼 서비스 또는 맞춤형 스케일링 알고리즘을 사용하여 구현됩니다.

사용자 트래픽이 변동할 때, 오토 스케일링은 시스템이 부하를 처리하는 데 필요한 용량을 항상 확보해 성능 저하나 중단을 방지합니다.

04 image.png

5. Rate Limiting(호출 제한)

매우 바쁜 공항의 활주로가 15분마다 단 두 번의 착륙만 처리할 수 있다고 상상해 보세요. 더 많은 착륙을 시도하면 사고가 발생해 활주로를 완전히 망가뜨리게 될 것입니다. 승객의 생명을 위험에 빠뜨리는 것은 말할 것도 없죠. 이 경우 관제사는 15분마다 2대의 비행기만 착륙할 수 있도록 들어오는 비행기를 조정함으로써 호출 제한기(Rate Limiter) 역할도 합니다.

사용자 요청과 관련하여 애플리케이션에도 동일한 개념이 적용됩니다. 이 전략은 초당 또는 분당 고정된 수의 요청과 같이 주어진 시간 프레임 내에서 사용자 또는 시스템이 요청할 수 있는 수에 제한을 두는 것을 포함합니다.

호출 제한은 로드 밸런서, 웹 서버 또는 애플리케이션 수준과 같은 다양한 계층에서 구현될 수 있습니다. 단일 사용자 또는 시스템이 모든 리소스를 사용하는 것을 방지함으로써 호출 제한은 모든 사용자에게 공정하고 안정적인 서비스를 보장하고 갑작스러운 트래픽 급증으로 인해 시스템이 과부하되는 것을 방지합니다.

05 image.png

자, 여러분들은 애플리케이션의 가용성을 향상시키기 위해 다른 어떤 전략을 사용해 보셨나요? 댓글을 남겨주세요 🙂

Top 1% 개발자로 거듭나는 확실한 처방전, 데브필이었습니다.

06 woonys__youtube_profile_image_the_channel_name_is_DevPill_softw_a07a80be-3468-4941-a672-9146f0f59b5b.png
 [출처] https://maily.so/devpill/posts/8do7x52ezgq

Loading

22 12월 2024

[chatGPT] 인간에 가까워진 추론력…오픈AI, 신모델 ‘o3’ 공개

[chatGPT] 인간에 가까워진 추론력…오픈AI, 신모델 ‘o3’ 공개

인간에 가까워진 추론력…오픈AI, 신모델 ‘o3’ 공개

입력
‘o1’ 업그레이드···내년 출시

[서울경제]

오픈AI가 한층 향상된 고급 추론 인공지능(AI) 모델 ‘o3’를 20일(현지 시간) 공개했다.

o3는 9월 출시된 ‘o1’의 업그레이드 버전이다. 오픈AI는 영국 스마트폰 브랜드 ‘O2’에 대한 존중 차원에서 모델명에서 ‘o2’를 건너뛰고 ‘o3’으로 정했다. 샘 올트먼 오픈AI 최고경영자(CEO)는 “내년 1월 말 소형 모델인 ‘o3 미니’를 먼저 출시하고 곧이어 o3를 내놓을 예정”이라고 말했다.

추론 능력에 초점을 둔 o3는 o1과 마찬가지로 응답하기 전에 먼저 생각하도록 훈련됐다. 작업을 추론하고 계획할 수 있으며 오랜 기간에 걸친 작업을 해나가는 데 있어 해결책을 찾는 데 도움이 된다고 오픈AI는 설명했다. o1과 마찬가지로 o3도 응답하는 데 몇 초∼몇 분 더 걸리지만 물리학·과학·수학과 같은 분야에서 더 신뢰할 수 있다고 오픈AI는 강조했다. 또 특정 조건에서는 o3가 범용인공지능(AGI)에 가까워졌다고 덧붙였다.

오픈AI는 o3가 벤치마크(성능 측정)에서 다른 모델을 압도한다고 강조했다. 특히 올해 미국 초청 수학 시험(AIME)에서는 단 한 문제만 틀려 96.7%의 점수를 기록했고, 대학원 수준의 생물학, 물리학, 화학 문제 테스트(GPQA 다이아몬드)에서는 87.7%의 성과를 거뒀다고 오픈AI는 설명했다.

Loading

19 12월 2024

[wordpress, 워드프레스] WordPress 페이지또는 글에 별도 CSS와 JavaScript 추가하기

[wordpress, 워드프레스] WordPress 페이지또는 글에 별도 CSS와 JavaScript 추가하기

WordPress 페이지또는 글에 별도 CSS와 JavaScript 추가하기

WordPress 페이지또는 글에 별도 CSS와 JavaScript 추가하기

안녕하세요
RWDB 입니다~!!!

오늘 소개해드릴 내용은 WordPress 관련 내용인데요

WordPress에서 각 페이지나 글 등록시 해당 페이지나 글에만 적용되고 싶은 CSS, JavaScript 꼭 있잖아요??
그걸 쉽게~~ 아주 쉽게 하실 수 있게 하는 내용 입니다.

※ 다음에 소개하는 방법 functions.php을 사용하기 때문에 테마에 functions.php없는 경우 작성하십시오.

CSS를 추가 할 수 있도록

CSS를 추가 할 수 있도록하려면 아래 내용을 functions.php에 추가해주시면 됩니다.

functions.php

//Custom CSS Widget
add_action( 'admin_menu', 'custom_css_hooks' );
add_action( 'save_post', 'save_custom_css' );
add_action( 'wp_head','insert_custom_css' );
function custom_css_hooks() {
  add_meta_box( 'custom_css', 'Custom CSS', 'custom_css_input', 'post', 'normal', 'high' );
  add_meta_box( 'custom_css', 'Custom CSS', 'custom_css_input', 'page', 'normal', 'high' );
}
function custom_css_input() {
  global $post;
  echo '<input type="hidden" name="custom_css_noncename" id="custom_css_noncename" value="'.wp_create_nonce('custom-css').'" />';
  echo '<textarea name="custom_css" id="custom_css" rows="5" cols="30" style="width:100%;">'.get_post_meta($post->ID,'_custom_css',true).'</textarea>';
}
function save_custom_css($post_id) {
  if ( !wp_verify_nonce( $_POST['custom_css_noncename'], 'custom-css' ) ) return $post_id;
  if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE) return $post_id;
  $custom_css = $_POST['custom_css'];
  update_post_meta( $post_id, '_custom_css', $custom_css );
}
function insert_custom_css() {
  if ( is_page() || is_single() ) {
    if ( have_posts() ) : while ( have_posts() ) : the_post();
      echo '<style type="text/css">' . get_post_meta(get_the_ID(), '_custom_css', true) . '</style>';
    endwhile; endif;
    rewind_posts();
  }
}

JavaScript를 추가 할 수 있도록

JavaScript를 추가 할 수 있도록하려면 아래 내용을 functions.php에 추가해주시면 끝!

functions.php

//Custom JS Widget
add_action( 'admin_menu', 'custom_js_hooks' );
add_action( 'save_post', 'save_custom_js' );
add_action( 'wp_head','insert_custom_js' );
function custom_js_hooks() {
  add_meta_box( 'custom_js', 'Custom JS', 'custom_js_input', 'post', 'normal', 'high' );
  add_meta_box( 'custom_js', 'Custom JS', 'custom_js_input', 'page', 'normal', 'high' );
}
function custom_js_input() {
  global $post;
  echo '<input type="hidden" name="custom_js_noncename" id="custom_js_noncename" value="'.wp_create_nonce('custom-js').'" />';
  echo '<textarea name="custom_js" id="custom_js" rows="5" cols="30" style="width:100%;">'.get_post_meta($post->ID,'_custom_js',true).'</textarea>';
}
function save_custom_js($post_id) {
  if (!wp_verify_nonce($_POST['custom_js_noncename'], 'custom-js')) return $post_id;
  if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id;
  $custom_js = $_POST['custom_js'];
  update_post_meta($post_id, '_custom_js', $custom_js);
}
function insert_custom_js() {
  if ( is_page() || is_single() ) {
    if ( have_posts() ) : while ( have_posts() ) : the_post();
      echo '<script type="text/javascript">' . get_post_meta(get_the_ID(), '_custom_js', true) . '</script>';
    endwhile; endif;
    rewind_posts();
  }
}

CSS와 JavaScript를 모두 사용하시려면 둘다 넣으시면 되겠죠?? ㅋ
functions.php 파일을 저장후 편집 페이지를 확인해보시면 아래 이미지와 같이 추가된걸
확인 하실 수 있습니다. 

Custom CSS Write Panel

 [출처] http://rwdb.kr/wordpress-page-css-javascript/

Loading

3 12월 2024

[교직훈련/교수법] IT 개발자에서 결국, 인생2막 “교육자”로 변신 中

[교직훈련/교수법] IT 개발자에서 결국, 인생2막 “교육자”로 변신 中

27년 넘게 개발자로 일하며 다양한 프로젝트를 경험했는데요, 이제는 제가 가진 경험과 노하우를 다른 분들과 나누고 싶어서 새로운 도전을 시작했습니다. 최근 “국가 직업능력 훈련 교사” 자격증을 취득하고, 직업훈련교사로의 전환을 준비 중입니다.

앞으로는 실무에서 쌓은 이야기를 바탕으로, 필요한 기술과 지식을 전달하며 함께 성장할 수 있는 교육자가 되고 싶습니다.

직업능력개발훈련교사 자격증(web용_blur처리).png

Loading

1 12월 2024

[교직훈련/교수법] 생성 AI(ChatGPT 포함) 시대의 대학교수법

[교직훈련/교수법] 생성 AI(ChatGPT 포함) 시대의 대학교수법

주요 요약 (5-10개 포인트)

  1. 생성 AI 시대의 대학 교수법 변화
    • ChatGPT와 같은 생성 AI는 대학 강의의 구성 및 전달 방식에 새로운 기회를 제공하며, 교수법과 학습법 모두를 변화시키고 있음.
    • 맞춤형 콘텐츠 제공, 학습자의 이해도 실시간 측정, 개인화된 학습 지원 가능.
  2. AI 도입의 장점과 한계
    • AI를 활용하면 강의 준비 시간 단축, 자료 제작, 시험 문제 생성 등의 업무를 지원받을 수 있음.
    • 하지만 데이터의 정확성 문제와 가짜 정보 생성의 위험성 존재.
  3. 빌 게이츠와 AI 시대의 혁명적 전환
    • 빌 게이츠는 AI를 윈도우 GUI 이후 가장 혁신적인 기술로 평가하며, 개인과 기업의 AI 활용 능력이 경쟁력을 결정할 것이라고 강조.
  4. ChatGPT 활용 사례와 교수법 개선
    • ChatGPT를 활용한 강의 계획서 작성, 학습 자료 준비, 시험 문제 생성 등 구체적인 사례 공유.
    • 예: 교육행정학 강의 계획, 연구 아이디어 생성, 학생 관리 및 평가 방법 제안.
  5. AI 기반 조교 역할
    • ChatGPT는 교수의 조교처럼 반복적인 작업을 수행하며 강의와 연구를 지원.
    • 예를 들어 보고서 주제 제안, 연구 논문 초안 생성, 인터뷰 가이드 작성 등에서 활용.
  6. 학생과의 상호작용 개선
    • 학생 동기 부여를 위한 다양한 방법 제안, 수업 중 규칙 설정 및 문제 해결 방안 제공.
    • 예: 수업 중 조는 학생 대처법, 질문 유도 방법 등.
  7. AI의 위험성
    • AI 챗봇의 오작동으로 인한 심각한 사례(예: 사용자에게 자살을 종용) 언급.
    • 감정 공유형 AI와 관련된 윤리적 문제도 제기.
  8. 미래 교수법과 AI 활용의 방향성
    • 교수들은 AI 활용 방법을 숙지하고 윤리적 한계를 인식해야 함.
    • AI의 활용은 강의 지원 도구로서 조교 역할을 넘어 강의 내용 구성, 학습 맞춤화로 확대 가능.
  9. 연구 분야에서의 AI 활용 한계
    • 연구 논문 작성에서 아이디어 제공은 가능하지만, 인용된 자료의 신뢰성 부족.
    • 생성된 데이터나 자료는 반드시 검증 필요.
  10. 질문과 답변 세션 계획
    • AI를 활용해 실시간 질문에 답변하거나, 강의와 연구 자료를 개선할 수 있도록 세션을 진행할 계획.
    • 학생들의 적극적인 참여와 새로운 AI 활용법 학습이 강조됨.

Loading

29 11월 2024

[DeepLearning] Learning to generate lyrics and music with Recurrent Neural Networks : 순환 신경망을 사용하여 가사와 음악을 생성하는 방법 배우기

[DeepLearning] Learning to generate lyrics and music with Recurrent Neural Networks : 순환 신경망을 사용하여 가사와 음악을 생성하는 방법 배우기

순환 신경망을 사용하여 가사와 음악을 생성하는 방법 배우기

RNN 기반 생성 모델을 가사와 피아노 음악 생성에 적용한 사례를 보여주는 게시물입니다.


소개

이 게시물에서는 가장 인기 있는/최근 아티스트의 가사 데이터 세트에서 RNN 문자 수준 언어 모델을 학습합니다. 학습된 모델을 가지고 다양한 아티스트의 다양한 스타일을 재밌게 섞은 몇 곡을 샘플링합니다. 그런 다음 모델을 업데이트하여 조건부 문자 수준 RNN으로 만들어 아티스트에 따라 노래를 샘플링할 수 있습니다. 마지막으로 피아노 곡의 미디 데이터 세트에서 모델을 학습하여 마무리합니다. 이러한 모든 작업을 해결하는 동안 문자 수준 RNN, 조건부 문자 수준 RNN, RNN 샘플링, 시간에 따른 절단된 역전파 및 그래디언트 체크포인팅과 같은 RNN 학습 및 추론과 관련된 몇 가지 흥미로운 개념을 간략하게 살펴보겠습니다. 모든 코드와 학습된 모델은 github에서 사용할 수 있으며 Pytorch 로 구현되었습니다 . 블로그 게시물은 jupyter notebook 형식으로도 볼 수 있습니다 . 문자 수준 언어 모델과 순환 신경망에 익숙하다면 해당 섹션을 건너뛰거나 결과 섹션으로 바로 이동하세요.

문자 수준 언어 모델

PNG 파일

모델을 선택하기 전에, 우리의 과제를 자세히 살펴보겠습니다. 현재 문자와 이전의 모든 문자가 주어졌을 때, 우리는 다음 문자를 예측해 볼 것입니다. 훈련하는 동안 우리는 시퀀스를 취하고, 마지막 문자를 제외한 모든 문자를 입력으로 사용하고, 두 번째 문자에서 시작하는 동일한 시퀀스를 기준 진실로 사용할 것입니다(위의 그림 참조; 출처 ). 우리는 예측을 할 때 이전의 모든 문자를 무시하는 가장 간단한 모델에서 시작하여, 이 모델을 개선하여 특정 수의 이전 문자만 고려하도록 하고, 예측을 할 때 이전의 모든 문자를 고려하는 모델로 결론지을 것입니다.

우리의 언어 모델은 문자 수준에서 정의됩니다. 우리는 모든 영어 문자와 마침표, 쉼표, 줄 끝 기호와 같은 일부 특수 기호를 포함하는 사전을 만들 것입니다. 각 문자는 one-hot-encoded 텐서로 표현됩니다. 문자 수준 모델과 예제에 대한 자세한 내용은 이 리소스를 추천합니다 .

문자를 가지고 있으므로 이제 문자 시퀀스를 형성할 수 있습니다. 지금도 고정된 확률로 문자를 무작위로 샘플링하여 문장을 생성할 수 있습니다 . 이것이 가장 간단한 문자 수준 언어 모델입니다. 이것보다 더 나은 방법은 없을까요? 그렇습니다. 훈련 코퍼스에서 각 문자의 발생 확률(문자가 발생하는 횟수를 데이터 세트 크기로 나눈 값)을 계산하고 이러한 확률을 사용하여 문자를 무작위로 샘플링할 수 있습니다. 이 모델은 더 좋지만 각 문자의 상대적인 위치적 측면을 완전히 무시합니다. 예를 들어, 단어를 읽는 방법에 주의하세요. 첫 번째 문자부터 시작하는데, 이는 일반적으로 예측하기 어렵지만 단어의 끝에 도달하면 때때로 다음 문자를 추측할 수 있습니다. 단어를 읽을 때 다른 텍스트를 읽고 배운 일부 규칙을 암묵적으로 사용하고 있습니다. 예를 들어, 단어에서 읽는 문자가 하나 더 추가될 때마다 공백 문자의 확률이 증가하거나(정말 긴 단어는 드뭅니다) 문자 “r” 뒤에 자음이 올 확률은 일반적으로 모음 뒤에 오기 때문에 낮습니다. 비슷한 규칙이 많이 있고, 우리 모델이 데이터로부터 이를 학습할 수 있기를 바랍니다. 우리 모델이 이러한 규칙을 학습할 수 있는 기회를 주기 위해 모델을 확장해야 합니다.

모델을 조금씩 점진적으로 개선하고 각 문자의 확률을 이전에 발생한 문자에만 의존하도록 합시다( 마르코프 가정 ). 따라서 기본적으로 . 이것은 마르코프 연쇄 모델 입니다( 익숙하지 않다면 이러한 대화형 시각화 도 시도해 보세요). 또한 훈련 데이터 세트에서 확률 분포를 추정할 수 있습니다. 이 모델은 대부분의 경우 현재 문자의 확률이 이전 문자에만 의존하지 않기 때문에 제한적입니다.

우리가 모델링하고자 하는 것은 실제로 . 처음에는 이전 문자의 수가 가변적이고 긴 시퀀스의 경우 정말 커질 수 있기 때문에 작업이 난해해 보입니다. Reccurent Neural Netoworks는 공유 가중치와 고정 크기 숨겨진 상태를 사용하여 어느 정도 이 문제를 해결할 수 있는 것으로 밝혀졌습니다. 이는 RNN에 전념하는 다음 섹션으로 이어집니다.

순환 신경망

PNG 파일

순환 신경망은 순차적 데이터를 처리하기 위한 신경망 계열입니다. 피드포워드 신경망과 달리 RNN은 내부 메모리를 사용하여 임의의 입력 시퀀스를 처리할 수 있습니다. 임의의 크기의 입력 시퀀스로 인해 사이클이 있는 그래프로 간결하게 표현됩니다(그림 참조; 출처 ). 하지만 입력 시퀀스의 크기를 알면 “펼쳐질” 수 있습니다. 현재 입력 과 이전 숨겨진 상태 에서 출력 과 현재 숨겨진 상태 로의 비선형 매핑을 정의합니다 . 숨겨진 상태 크기는 미리 정의된 크기를 가지며 각 단계에서 업데이트되고 매핑 결과에 영향을 미치는 기능을 저장합니다.

이제 문자 수준 언어 모델의 이전 그림과 접힌 RNN 그림을 맞춰서 RNN 모델을 사용하여 문자 수준 언어 모델을 어떻게 학습하는지 살펴보겠습니다.

그림에서는 Vanilla RNN을 사용하고 있지만, 우리의 작업에서는 LSTM을 사용할 것입니다. 왜냐하면 훈련이 더 쉽고 보통 더 나은 결과를 얻을 수 있기 때문입니다.

RNN에 대한 더 자세한 소개는 다음 자료 를 참조하세요 .

가사 데이터 세트

실험을 위해 우리는 다양한 최신 아티스트와 더 오래된 아티스트를 포함하는 55,000개 이상의 노래 가사 Kaggle 데이터 세트를 선택했습니다 . 이는 판다스 파일로 저장되며, 훈련 목적으로 사용할 수 있도록 파이썬 래퍼를 작성했습니다. 코드를 사용하려면 직접 다운로드해야 합니다.

결과를 더 잘 해석하기 위해, 나는 내가 어느 정도 알고 있는 아티스트 하위 집합을 선택했습니다.

artists = [
'ABBA',
'Ace Of Base',
'Aerosmith',
'Avril Lavigne',
'Backstreet Boys',
'Bob Marley',
'Bon Jovi',
'Britney Spears',
'Bruno Mars',
'Coldplay',
'Def Leppard',
'Depeche Mode',
'Ed Sheeran',
'Elton John',
'Elvis Presley',
'Eminem',
'Enrique Iglesias',
'Evanescence',
'Fall Out Boy',
'Foo Fighters',
'Green Day',
 'HIM',
 'Imagine Dragons',
 'Incubus',
 'Jimi Hendrix',
 'Justin Bieber',
 'Justin Timberlake',
'Kanye West',
 'Katy Perry',
 'The Killers',
 'Kiss',
 'Lady Gaga',
 'Lana Del Rey',
 'Linkin Park',
 'Madonna',
 'Marilyn Manson',
 'Maroon 5',
 'Metallica',
 'Michael Bolton',
 'Michael Jackson',
 'Miley Cyrus',
 'Nickelback',
 'Nightwish',
 'Nirvana',
 'Oasis',
 'Offspring',
 'One Direction',
 'Ozzy Osbourne',
 'P!nk',
 'Queen',
 'Radiohead',
 'Red Hot Chili Peppers',
 'Rihanna',
 'Robbie Williams',
 'Rolling Stones',
 'Roxette',
 'Scorpions',
 'Snoop Dogg',
 'Sting',
 'The Script',
 'U2',
 'Weezer',
 'Yellowcard',
 'ZZ Top']

무조건 문자 수준 언어 모델 훈련

우리의 첫 번째 실험은 전체 코퍼스에서 문자 수준 언어 모델 RNN을 훈련하는 것으로 구성되었습니다. 훈련하는 동안 아티스트 정보는 고려하지 않았습니다.

RNN에서 샘플링

모델을 훈련한 후 몇 곡을 샘플링해 보겠습니다. 기본적으로 RNN은 각 단계에서 로짓을 출력하고 이를 소프트맥스하여 해당 분포에서 샘플링할 수 있습니다. 또는 Gumble-Max 트릭을 사용하여 로짓을 직접 샘플링 할 수도 있는데 이는 동일합니다.

샘플링에 대한 흥미로운 점 하나는 우리가 입력 시퀀스를 부분적으로 스스로 정의하고 그 초기 조건으로 샘플링을 시작할 수 있다는 것입니다. 예를 들어, “Why”로 시작하는 노래를 샘플링할 수 있습니다.

Why do you have to leave me?  
I think I know I'm not the only one  
I don't know if I'm gonna stay awake  
I don't know why I go along  
  
I don't know why I can't go on  
I don't know why I don't know  
I don't know why I don't know  
I don't know why I keep on dreaming of you   

음, 그럴 법한 노래네요 😀

“Well”로 시작하는 노래로 샘플링해 보겠습니다.

Well, I was a real good time  
I was a rolling stone  
I was a rock and roller  
Well, I never had a rock and roll  
There were times I had to do it  
I had a feeling that I was found  
I was the one who had to go  

샘플링 중에 사용되는 “온도” 매개변수가 있는데, 이는 샘플링 프로세스의 무작위성을 제어합니다. 이 매개변수가 0에 가까워지면 샘플링은 argmax와 동일하고 무한대에 가까워지면 샘플링은 균일한 분포에서 샘플링하는 것과 동일합니다. Jang et al.의 관련 논문 에서 그림을 살펴보세요 .

PNG 파일

, 분포는 영향을 받지 않습니다. 를 감소시키면 분포가 더 두드러지게 되며, 이는 더 큰 확률 질량을 가진 값이 증가한다는 것을 의미합니다. 를 0에 가까워지면 샘플링 은 armax와 동일해지므로 해당 값의 확률이 1에 가까워집니다. 를 증가시키기 시작하면 분포가 점점 더 균일해집니다.

이전 샘플은 온도 매개변수가 . 와 같도록 생성되었습니다. . 로 늘리면 어떻게 되는지 살펴보겠습니다 . 샘플:

Why can't we drop out of time?  
We were born for words to see.  
Won't you love this. You're still so amazing.  
This could be that down on Sunday Time.  
Oh, Caroline, a lady floor.  
I thought of love, oh baby.  

좀더 늘려보도록 하죠.

Why - won't we grow up naked?  
We went quietly what we would've still give  
That girl you walked before our bedroom room  
I see your mind is so small to a freak  
Stretching for a cold white-heart of crashing  
Truth in the universal daughter  
  
I lose more and more hard  
I love you anytime at all  
Ah come let your help remind me  
Now I've wanted waste and never noticed  
  
I swear I saw you today  
You needed to get by  
But you sold a hurricane  
Well out whispered in store

사실, 왜 우리는 벌거벗고 자라지 않을까요? 😀 온도가 높아질수록 샘플링된 문장이 점점 더 무작위적이 되는 추세를 볼 수 있죠.

조건부 문자 수준 언어 모델 훈련

특정 아티스트의 스타일로 가사를 생성할 수 있다고 상상해보세요. 모델을 변경하여 훈련 중에 이 정보를 사용할 수 있도록 합시다.

우리는 RNN에 추가 입력을 추가하여 이를 수행할 것입니다. 지금까지 우리의 RNN 모델은 각 단계에서 원핫 인코딩된 문자가 포함된 텐서만 허용했습니다.

우리 모델의 확장은 매우 간단할 것입니다. 아티스트를 나타내는 추가 원핫 인코딩 텐서가 있을 것입니다. 따라서 각 단계에서 RNN은 캐릭터와 아티스트를 나타내는 연결된 텐서로 구성되는 텐서 하나를 허용합니다. 자세한 내용은 여기를 참조하세요 .

조건 언어 모델 RNN에서 샘플링

훈련 후, 우리는 아티스트에 따라 몇 곡을 샘플링했습니다. 아래에서 몇 가지 결과를 찾을 수 있습니다.

그를:

My fears  
And the moment don't make me sing  
So free from you  
The pain you love me yeah  
  
Whatever caused the warmth  
You smile you're happy  
You sit away  
You say it's all in vain  

실제로 가능해 보이는데, 특히 ‘고통’이라는 단어가 사용됐기 때문입니다. 이 단어는 아티스트의 가사에서 매우 흔하게 쓰입니다.

아바:

Oh, my love it makes me close a thing  
You've been heard, I must have waited  
I hear you  
So I say  
Thank you for the music, that makes me cry  
  
And you moving my bad as me, ah-hang wind in the hell  
I was meant to be with you, I'll never be playing up

밥 말리:

Mercy on judgment, we got so much  
  
Alcohol, cry, cry, cry  
Why don't try to find our own  
I want to know, Lord, I wanna give you  
Just saving it, learned  
Is there any more?  
  
All that damage done  
That's all reason, don't worry  
Need a hammer  
I need you more and more  

콜드플레이:

Look at the stars  
Into life matter where you lay  
Saying no doubt  
I don't want to fly  
In my dreams and fight today

I will fall for you  
  
All I know  
And I want you to stay  
Into the night  
  
I want to live waiting  
With my love and always  
Have I wouldn't wasted  
Would it hurt you

카니예 웨스트:

I'm everywhere for you  
The way that it couldn't stop  
I mean it too late and love I made in the world  
I told you so I took the studs full cold-stop  
The hardest stressed growin'  
The hustler raisin' on my tears  
I know I'm true, one of your love

꽤 멋져 보이지만 검증 정확도를 추적하지 않았기 때문에 일부 샘플링된 라인은 rnn에서 기억했을 수도 있다는 점을 명심하세요.더 나은 방법은 훈련 중에 가장 좋은 검증 점수를 제공하는 모델을 선택하는 것입니다(이런 방식으로 훈련을 수행한 다음 섹션의 코드 참조).또한 흥미로운 사실 ​​하나를 발견했습니다.무조건 모델은 일반적으로 지정된 시작 문자열로 샘플링할 때 더 나은 성능을 보입니다.지정된 시작 문자열로 조건부 모델에서 샘플링할 때 실제로 모델에 두 가지 조건(시작 문자열과 아티스트)을 적용한 반면, 이전에 탐색한 모델의 경우 하나의 조건만 적용했습니다.그리고 그 조건부 분포를 잘 모델링할 만큼 충분한 데이터가 없었습니다(모든 아티스트가 비교적 제한된 수의 노래를 가지고 있음).

우리는 코드와 모델을 공개하고 있으며, GPU 없이도 훈련된 모델에서 노래를 샘플링할 수 있습니다. 이는 실제로 컴퓨팅 측면에서 많은 요구가 없기 때문입니다.

미디 데이터 세트

다음으로, 우리는 대략 피아노 곡으로 구성된 작은 미디 데이터세트 로 작업할 것입니다 . 우리는 피아노 데이터세트(트레이닝 분할만)를 사용했습니다 .Nottingam

모든 미디 파일을 피아노 롤로 변환 할 수 있다는 것이 밝혀졌습니다. 피아노 롤은 각 행이 다른 미디 피치이고 각 열이 시간적으로 다른 슬라이스인 시간-주파수 행렬입니다. 따라서 데이터 세트의 각 피아노 곡은 크기의 행렬로 표현되며 , 여기서 는 피아노의 피치 수입니다. 피아노 롤 행렬의 예는 다음과 같습니다.

PNG 파일

이 표현은 음악 이론에 익숙하지 않은 사람이라도 매우 직관적이고 해석하기 쉽습니다. 각 행은 피치를 나타냅니다. 위쪽 행은 저주파 피치를 나타내고 아래쪽 행은 고주파 피치를 나타냅니다. 게다가 시간을 나타내는 수평축이 있습니다. 따라서 특정 피치의 사운드를 특정 시간 동안 연주하면 수평선이 표시됩니다. 전반적으로 이는 유튜브의 피아노 튜토리얼 과 매우 유사합니다 .

이제 문자 수준 모델과 새로운 작업의 유사점을 살펴보겠습니다. 현재의 경우 이전에 연주된 모든 피치를 고려하여 다음 타임스텝에서 연주될 피치를 예측해야 합니다. 피아노 롤 그림을 보면 각 열은 어떤 종류의 음악적 캐릭터를 나타내며 이전의 모든 음악적 캐릭터를 고려하여 다음 음악을 예측하려고 합니다. 텍스트 문자와 음악적 캐릭터의 차이점에 주의해 보겠습니다. 기억하시겠지만 언어 모델의 각 캐릭터는 원핫 벡터로 표현되었습니다(즉, 벡터에서 하나의 값만 이고 다른 값은 입니다 ). 음악적 캐릭터의 경우 한 타임스텝에서 여러 키를 누를 수 있습니다(다성음 데이터 세트로 작업하고 있기 때문입니다). 이 경우 각 타임스텝은 두 개 이상의 를 포함할 수 있는 벡터로 표현됩니다 .

피치 레벨 피아노 음악 모델 훈련

학습을 시작하기 전에, 이전 섹션에서 논의한 다양한 입력을 설명하기 위해 언어 모델에 사용한 손실을 조정해야 합니다. 언어 모델에서, 각 타임스텝에 대한 입력으로 원-핫 인코딩된 텐서(문자)를 사용했고, 출력(예측된 다음 문자)으로 원-핫 인코딩된 텐서를 사용했습니다. 예측된 다음 문자에 대해 단일 배타적 선택을 해야 했기 때문에, 교차 엔트로피 손실을 사용했습니다 .

하지만 이제 우리 모델은 더 이상 원핫 인코딩(여러 키를 누를 수 있음)이 아닌 벡터를 출력합니다. 물론, 눌린 키의 모든 가능한 조합을 별도의 클래스로 처리할 수 있지만, 이는 어렵습니다. 대신 출력 벡터의 각 요소를 이진 변수( – 누름, – 키를 누르지 않음)로 처리합니다. 출력 벡터의 각 요소에 대한 별도의 손실을 이진 교차 엔트로피로 정의합니다. 그리고 최종 손실은 이러한 이진 교차 엔트로피의 평균 합계가 됩니다. 더 잘 이해하기 위해 코드를 읽을 수도 있습니다.

앞서 언급한 변경 사항을 적용한 후, 우리는 모델을 훈련했습니다. 다음 섹션에서는 샘플링을 수행하고 결과를 검사합니다.

피치 레벨 RNN에서 샘플링

우리는 최적화 초기 단계에서 피아노 롤을 샘플링했습니다.

PNG 파일

우리 모델이 데이터 세트의 노래에서 공통적으로 나타나는 하나의 공통 패턴을 학습하기 시작한 것을 볼 수 있습니다. 각 노래는 두 개의 다른 부분으로 구성되어 있습니다. 첫 번째 부분에는 별도로 연주되고 매우 구별되며 종종 부를 수 있는 피치 시퀀스가 ​​포함되어 있습니다 (멜로디라고도 함). 샘플링된 피아노 롤을 보면 이 부분이 하단에서 명확하게 보입니다. 피아노 롤의 상단도 보면 일반적으로 함께 연주되는 피치 그룹이 보입니다. 이것은 멜로디를 동반하는 화음(노래 전체에서 함께 연주되는 피치)의 진행 또는 하모니입니다.

훈련이 끝날 무렵 우리 모델에서 추출한 샘플은 다음과 같이 보이기 시작했습니다.

PNG 파일

보시다시피 이는 이전 섹션에서 보여드린 실제 피아노 롤 사진과 더욱 유사해 보이기 시작했습니다.

훈련 후, 우리는 노래를 샘플링하고 분석했습니다. 흥미로운 소개가 있는 샘플 하나를 얻었습니다 . 다른 샘플은 멋진 스타일 전환을 특징으로 합니다 . 동시에 낮은 온도 매개변수를 가진 몇 가지 예를 생성하여 느린 템포의 노래를 만들었습니다. 첫 번째 와 두 번째는 여기 있습니다 . 전체 재생 목록은 여기 에서 찾을 수 있습니다 .

이제 GPU 메모리 소비와 속도 관점에서 문제를 살펴보겠습니다.

우리는 배치로 시퀀스를 처리함으로써 계산 속도를 크게 높였습니다. 동시에, 시퀀스가 ​​길어질수록(데이터 세트에 따라 다름) 최대 배치 크기가 감소하기 시작합니다. 왜 그럴까요? 역전파를 사용하여 기울기를 계산할 때, 메모리 소비에 가장 큰 영향을 미치는 모든 중간 활동을 저장해야 합니다. 시퀀스가 ​​길어질수록 더 많은 활성화를 저장해야 하므로 배치에 더 적은 예제를 넣을 수 있습니다.

때로는 정말 긴 시퀀스로 작업해야 하거나 배치 크기를 늘리거나, 아니면 사용 가능한 메모리 양이 적은 GPU가 필요할 수도 있습니다. 이 경우 메모리 소모를 줄이는 여러 가지 가능한 솔루션이 있지만, 서로 다른 상충 관계가 있는 두 가지를 언급하겠습니다.

첫 번째는 잘린 역전파 입니다 . 아이디어는 전체 시퀀스를 하위 시퀀스로 분할하고 이를 별도의 배치로 처리하는 것입니다. 단, 이러한 배치를 분할 순서대로 처리하고 모든 다음 배치는 이전 배치의 숨겨진 상태를 초기 숨겨진 상태로 사용합니다. 또한 이 접근 방식의 구현을 제공하여 더 잘 이해할 수 있도록 합니다. 이 접근 방식은 분명히 전체 시퀀스를 처리하는 것과 정확히 동일하지는 않지만 더 자주 업데이트하고 메모리를 덜 사용합니다. 반면에 한 하위 시퀀스의 길이를 넘어서는 장기 종속성을 포착하지 못할 가능성이 있습니다.

두 번째는 그래디언트 체크포인팅 입니다 . 이 방법은 더 많은 계산을 수행하는 대가로 전체 시퀀스에서 모델을 학습하는 동안 더 적은 메모리를 사용할 수 있는 가능성을 제공합니다. 기억하시겠지만, 이전에 학습하는 동안 가장 많은 메모리가 활성화에 의해 차지된다고 언급했습니다. 그래디언트 체크포인팅의 아이디어는 모든 -번째 활성화만 저장하고 나중에 저장되지 않은 활성화를 다시 계산하는 것입니다. 이 방법은 이미 Tensorflow에 구현되어 있으며 Pytorch에 구현되고 있습니다 .

결론 및 향후 작업

저희의 작업에서는 텍스트에 대한 간단한 생성 모델을 훈련하고, 다성음악에 맞춰 모델을 확장했으며, 샘플링이 작동하는 방식과 온도 매개변수가 텍스트와 음악 샘플에 어떤 영향을 미치는지 간략히 살펴보았습니다. 낮은 온도는 더 안정적인 결과를 제공하는 반면, 높은 온도는 더 많은 무작위성을 추가하여 때로는 매우 흥미로운 샘플이 생성됩니다.

향후 작업에는 두 가지 방향이 포함될 수 있습니다. 더 많은 응용 프로그램 또는 이미 훈련된 모델에 대한 심층 분석입니다. 예를 들어 동일한 모델을 Spotify 청취 기록에 적용할 수 있습니다. 청취 기록 데이터에 대한 학습이 끝나면 이전 1시간 정도 동안 들었던 노래 시퀀스를 제공하면 하루 종일 재생 목록을 샘플링합니다. 탐색 기록에도 동일한 작업을 수행할 수 있으며, 탐색 행동 패턴을 분석하는 멋진 도구가 됩니다. 다양한 활동(헬스장에서 운동, 사무실에서 일하기, 수면)을 수행하는 동안 휴대폰에서 가속도계 및 자이로스코프 데이터를 수집 하고 이러한 활동 단계를 분류하는 방법을 학습합니다. 그런 다음 활동에 따라 음악 재생 목록을 자동으로 변경할 수 있습니다(수면 – 비 오는 차분한 음악, 헬스장에서 운동 – 고강도 음악). 의료 응용 프로그램의 경우 이 작업 과 유사하게 모델을 적용하여 맥박 및 기타 데이터를 기반으로 심장 문제를 감지할 수 있습니다 .

음악 생성을 위해 훈련된 RNN에서 뉴런 발화를 분석하는 것은 매우 흥미로울 것입니다 . 모델이 몇 가지 간단한 음악 개념(화성과 멜로디에 대한 논의와 같은)을 암묵적으로 배웠는지 확인하기 위해서입니다. RNN의 숨겨진 표현을 사용하여 음악 데이터 세트를 클러스터링하여 유사한 노래를 찾을 수 있습니다.

이 글을 마무리하기 위해 무조건 모델의 마지막 가사를 샘플링해 보겠습니다 😀 :

The story ends  
The sound of the blue  
The tears were shining  
The story of my life  
I still believe  
The story of my life 

[출처] https://warmspringwinds.github.io/pytorch/rnns/2018/01/27/learning-to-generate-lyrics-and-music-with-recurrent-neural-networks/

Learning to generate lyrics and music with Recurrent Neural Networks

A post showing an application of RNN-based generative models for lyrics and piano music generation.


Introduction

In this post we will train RNN character-level language model on lyrics dataset of most popular/recent artists. Having a trained model, we will sample a couple of songs which will be a funny mixture of different styles of different artists. After that we will update our model to become a conditional character-level RNN, making it possible for us to sample songs conditioned on artist. And finally, we conclude by training our model on midi dataset of piano songs. While solving all these tasks, we will briefly explore some interesting concepts related to RNN training and inference like character-level RNN, conditional character-level RNN, sampling from RNN, truncated backpropagation through time and gradient checkpointing. All the code and trained models are available on github and were implemented in Pytorch. The blog post can also be viewed in a jupyter notebook format. If you are already familiar with the character-level language model and recurrent neural networks, feel free to skip respective sections or go directly to the results section.

Character-Level language model

png

Before choosing a model, let’s have a closer look at our task. Given current letter and all previous letters, we will try to predict the next character. During training we will just take a sequence, and use all its characters except the last one as an input and the same sequence starting from the second character as groundtruth (see the picture above; Source). We will start from the simplest model that ignores all the previous characters while making a prediction, improve this model to make it take only a certain number of previous characters into account, and conclude with a model that takes all the previous characters into consideration while making a prediction.

Our language model is defined on a character level. We will create a dictionary which will contain all English characters plus some special symbols, like period, comma, and end-of-line symbol. Each charecter will be represented as one-hot-encoded tensor. For more information about character-level models and examples, I recommend this resource.

Having characters, we can now form sequences of characters. We can generate sentences even now just by randomly sampling character after character with a fixed probability . That’s the most simple character level language model. Can we do better than this? Yes, we can compute the probabily of occurance of each letter from our training corpus (number of times a letter occures divided by the size of our dataset) and randomly sample letter using these probabilities. This model is better but it totally ignores the relative positional aspect of each letter. For example, pay attention on how you read any word: you start with the first letter, which is usually hard to predict, but as you reach the end of a word you can sometimes guess the next letter. When you read any word you are implicitly using some rules which you learned by reading other texts: for example, with each additional letter that you read from a word, the probability of a space character increases (really long words are rare) or the probability of any consonant after the letter “r” is low as it usually followed by vowel. There are lot of similar rules and we hope that our model will be able to learn them from data. To give our model a chance to learn these rules we need to extend it.

Let’s make a small gradual improvement of our model and let probability of each letter depend only on the previously occured letter (markov assumption). So, basically we will have . This is a Markov chain model (also try these interactive visualizations if you are not familiar with it). We can also estimate the probability distribution from our training dataset. This model is limited because in most cases the probability of the current letter depends not only on the previous letter.

What we would like to model is actually . At first, the task seems intractable as the number of previous letters is variable and it might become really large in case of long sequences. Turns out Reccurent Neural Netoworks can tackle this problem to a certain extent by using shared weights and fixed size hidden state. This leads us to a next section dedicated to RNNs.

Recurrent Neural Networks

png

Recurrent neural networks are a family of neural networks for processing sequential data. Unlike feedforward neural networks, RNNs can use their internal memory to process arbitrary sequences of inputs. Because of arbitrary size input sequences, they are concisely depicted as a graph with a cycle (see the picture; Source). But they can be “unfolded” if the size of input sequence is known. They define a non-linear mapping from a current input and previous hidden state to the output and current hidden state . Hidden state size has a predefined size and stores features which are updated on each step and affect the result of mapping.

Now align the previous picture of the character-level language model and the ufolded RNN picture to see how we are using the RNN model to learn a character level language model.

While the picture depicts the Vanilla RNN, we will use LSTM in our work as it is easier to train usually achieves better results.

For a more elaborate introduction to RNNs, we refer reader to the following resource.

Lyrics dataset

For our experiments we have chosen 55000+ Song Lyrics Kaggle dataset which contains good variety of recent artists and more older ones. It is stored as a pandas file and we wrote a python wrapper around it to be able to use it for training purposes. You will have to download it yourself in order to be able to use our code.

In order to be able to interpret the results better, I have chosen a subset of artists which I am more or less familiar with:

artists = [
'ABBA',
'Ace Of Base',
'Aerosmith',
'Avril Lavigne',
'Backstreet Boys',
'Bob Marley',
'Bon Jovi',
'Britney Spears',
'Bruno Mars',
'Coldplay',
'Def Leppard',
'Depeche Mode',
'Ed Sheeran',
'Elton John',
'Elvis Presley',
'Eminem',
'Enrique Iglesias',
'Evanescence',
'Fall Out Boy',
'Foo Fighters',
'Green Day',
 'HIM',
 'Imagine Dragons',
 'Incubus',
 'Jimi Hendrix',
 'Justin Bieber',
 'Justin Timberlake',
'Kanye West',
 'Katy Perry',
 'The Killers',
 'Kiss',
 'Lady Gaga',
 'Lana Del Rey',
 'Linkin Park',
 'Madonna',
 'Marilyn Manson',
 'Maroon 5',
 'Metallica',
 'Michael Bolton',
 'Michael Jackson',
 'Miley Cyrus',
 'Nickelback',
 'Nightwish',
 'Nirvana',
 'Oasis',
 'Offspring',
 'One Direction',
 'Ozzy Osbourne',
 'P!nk',
 'Queen',
 'Radiohead',
 'Red Hot Chili Peppers',
 'Rihanna',
 'Robbie Williams',
 'Rolling Stones',
 'Roxette',
 'Scorpions',
 'Snoop Dogg',
 'Sting',
 'The Script',
 'U2',
 'Weezer',
 'Yellowcard',
 'ZZ Top']

Training unconditional character-level language model

Our first experiment consisted of training of our character-level language model RNN on the whole corpus. We didn’t take into consideration the artist information while training.

Sampling from RNN

Let’s try to sample a couple of songs after training our model. Basically, on each step our RNN will output logits and we can softmax them and sample from that distribution. Or we can use Gumble-Max trick and sample using logits directly which is equivalent.

One intersting thing about sampling is that we can partially define the input sequence ourselves and start sampling with that initial condition. For example, we can sample a song that starts with “Why”:

Why do you have to leave me?  
I think I know I'm not the only one  
I don't know if I'm gonna stay awake  
I don't know why I go along  
  
I don't know why I can't go on  
I don't know why I don't know  
I don't know why I don't know  
I don't know why I keep on dreaming of you   

Well, that sounds like a possible song 😀

Let’s sample with a song that starts with “Well”:

Well, I was a real good time  
I was a rolling stone  
I was a rock and roller  
Well, I never had a rock and roll  
There were times I had to do it  
I had a feeling that I was found  
I was the one who had to go  

There is “temperature” parameter that is used during sampling which controls the randomness of sampling process. When this parameter approaches zero, the sampling is equivalent to argmax and when it is close to infinity the sampling is equivalent to sampling from a uniform distribution. Have a look at the figure from a relevant paper by Jang et al.:

png

When , the distribution is not affected. If we decrease , the distribution becomes more pronounced, meaning that value with bigger probability mass will have it increased. When will approach zero, sampling will be equivalent to armax, because the probability of that value will be close to one. When we start to icrease the distribution becomes more and more uniform.

The previous sample was generated with a temperature paramter equal to . Let’s see what happens when we increase it to and sample:

Why can't we drop out of time?  
We were born for words to see.  
Won't you love this. You're still so amazing.  
This could be that down on Sunday Time.  
Oh, Caroline, a lady floor.  
I thought of love, oh baby.  

Let’s try increasing it even more:

Why - won't we grow up naked?  
We went quietly what we would've still give  
That girl you walked before our bedroom room  
I see your mind is so small to a freak  
Stretching for a cold white-heart of crashing  
Truth in the universal daughter  
  
I lose more and more hard  
I love you anytime at all  
Ah come let your help remind me  
Now I've wanted waste and never noticed  
  
I swear I saw you today  
You needed to get by  
But you sold a hurricane  
Well out whispered in store

Why don’t we grow up naked, indeed? 😀 Well, you can see that trend that when we increase the temperature, sampled sentences become more and more random.

Training conditional character-level language model

Imagine if we could generate lyrics in a style of some particular artist. Let’s change our model, so that it can use this information during training.

We will do this by adding an additional input to our RNN. So far, our RNN model was only accepting tensors containing one-hot encoded character on each step.

The extention to our model will be very simple: we will have and additional one-hot encoded tensor which will represent the artist. So on each step the RNN will accept one tensor which will consist of concatenated tensors representing character and artist. Look here for more.

Sampling from conditional language model RNN

After training, we sampled a couple of songs conditined on artist. Below you can find some results.

Him:

My fears  
And the moment don't make me sing  
So free from you  
The pain you love me yeah  
  
Whatever caused the warmth  
You smile you're happy  
You sit away  
You say it's all in vain  

Seems really possible, especially the fact the the word pain was used, which is very common in the lyrics of the artist.

ABBA:

Oh, my love it makes me close a thing  
You've been heard, I must have waited  
I hear you  
So I say  
Thank you for the music, that makes me cry  
  
And you moving my bad as me, ah-hang wind in the hell  
I was meant to be with you, I'll never be playing up

Bob Marley:

Mercy on judgment, we got so much  
  
Alcohol, cry, cry, cry  
Why don't try to find our own  
I want to know, Lord, I wanna give you  
Just saving it, learned  
Is there any more?  
  
All that damage done  
That's all reason, don't worry  
Need a hammer  
I need you more and more  

Coldplay:

Look at the stars  
Into life matter where you lay  
Saying no doubt  
I don't want to fly  
In my dreams and fight today

I will fall for you  
  
All I know  
And I want you to stay  
Into the night  
  
I want to live waiting  
With my love and always  
Have I wouldn't wasted  
Would it hurt you

Kanye West:

I'm everywhere for you  
The way that it couldn't stop  
I mean it too late and love I made in the world  
I told you so I took the studs full cold-stop  
The hardest stressed growin'  
The hustler raisin' on my tears  
I know I'm true, one of your love

Looks pretty cool but keep in mind that we didn’t track the validation accuracy so some sampled lines could have been just memorized by our rnn. A better way to do it is to pick a model that gives best validation score during training (see the code for the next section where we performed training this way). We also noticed one interesting thing: the unconditional model usually performes better when you want to sample with a specified starting string. Our intuition is that when sampling from a conditional model with a specified starting string, we actually put two conditions on our model – starting string and an artist compared to the one condition in the case of previous model that we explored. And we didn’t have enough data to model that conditional distribution well (every artist has relatively limited number of songs).

We are making the code and models available and you can sample songs from our trained models even without gpu as it is not really computationally demanding.

Midi dataset

Next, we will work with a small midi dataset consisting of approximately piano songs. We have used the Nottingam piano dataset (training split only).

Turns out that any midi file can be converted to piano roll which is just is a time-frequency matrix where each row is a different MIDI pitch and each column is a different slice in time. So each piano song from our dataset will be represented as a matrix of size , where is a number of pitches of the piano. Here is an example of piano roll matrix:

png

This representation is very intuitive and easy to interpret even for a person that is not familiar with music theory. Each row represents a pitch: top rows represent low frequency pitches and bottom rows represent high pitches. Plus, we have a horizontal axis which represents time. So if we play a sound with a certain pitch for a certian period of time, we will see a horizontal line. Overall, this is very similar to piano tutorials on youtube.

Now, let’s try to see the similarities between the character-level model and our new task. In the current case, we will have to predict the pitches that will be played on the next timestep, given all the previously played pitches. So, if you look at the picture of the piano roll, each column represents some kind of a musical character and given all the previous musical characters, we want to predict the next one. Let’s pay attention to the difference between a text character and a musical character. If you recall, each character in our language model was represented by one-hot vector (meaning that only one value in our vector is and others are ). For music character multiple keys can be pressed at one timestep (since we are working with polyphonic dataset). In this case, each timestep will be represented by a vector which can contain more than one .

Training pitch-level piano music model

Before starting the training, we will have to adjust our loss that we have used for language model to account for different input that we discussed in the previous section. In the language model, we had one-hot encoded tensor (character) as an input on each timestep and one-hot encoded tensor as output (predicted next character). As we had to make a single exlusive choice for predicted next character, we used cross-entropy loss.

But now our model outputs a vector which is no longer one-hot encoded (multiple keys can be pressed). Of course, we can treat all possible combinations of pressed keys as a separate class, but this is intractable. Instead, we will treat each element of the output vector as a binary variable ( – pressing, – not pressing a key). We will define a separate loss for each element of the output vector to be binary cross-entropy. And our final loss will be an averaged sum of these binary cross-entropies. You can also read the code to get a better understanding.

After making the aforementioned changes, we trained our model. In the next section, we will perform sampling and inspect the results.

Sampling from pitch-level RNN

We have sampled piano rolls during the early stages of optimization:

png

You can see that our model is starting to learn one common pattern that is common among the songs from our dataset: each song consists of two different parts. First part contains a sequence of pitches that are played separately and are very distinguishable and are often singable (also know as melody). If you look at the sampled piano roll, this part can be clearly seen in the bottom. If you also have a look at the top of our piano roll, we can see a group of pitches that are usually played together – this is harmony or a progression of chords (pitches that are played together throughout the song) which accompanies the melody.

By the end of the training samples drawn from our model started to look like this:

png

As you can see they started to look more similar to the picture of the ground-truth piano roll that we showed in the previous sections.

After training, we have sampled songs and analyzed them. We got one sample with an interesting introduction. While another sample features a nice style transition. At the same time we generated a couple of examples with low temperature parameter which resulted in songs with a slow tempo: first one and a second one here. You can find the whole playlist here.

Now let’s look at our problem from the gpu memory consumption and speed point of view.

We greatly speed up computation by processing our sequences in batches. At the same time, as our sequences become longer (depending on the dataset), our max batch size starts to decrease. Why is it a case? As we use backpropagation to compute gradients, we need to store all the intermediate acitvations, which contribute the most to the memory consumption. As our sequence becomes longer, we need to store more activations, therefore, we can fit less examples in our batch.

Sometimes, we either have to work with really long sequences or we want to increase our batch size or maybe you just have a gpu with small amount of memory available. There are multiple possible solutions to reduce memory consumption in this case, but we will mention two, which will have different trade-offs.

First one is a truncated back propagation. The idea is to split the whole sequence into subsequences and treat them as separate batches with an exception that we process these batches in the order of split and every next batch uses hidden state of previous batch as an initial hidden state. We also provide an implementation of this approach, so that you can get the better understanding. This approach is obviously not an exact equivalent of processing the whole sequence but it makes more frequent updates and consumes less memory. On the other hand, there is a chance that we might not be able to capture long-term dependencies that span beyond the length of one subsequence.

Second one is gradient checkpointing. This method gives us a possibilty to use less memory while training our model on the whole sequence on the expence of performing more computation. If you recall, previously we mentioned that the most memory during training is occupied by activations. The idea of gradient checkpointing consists of storing only every -th activation and recomputing the unsaved activations later. This method is already implemented in Tensorflow and being implemented in Pytorch.

Conclusion and future work

In our work we trained simple generative model for text, extended our model to work with polyphonic music, briefly looked at how sampling works and how the temperature parameter affects our text and music samples – low temperature gives more stable results while high temperature adds more randomness which sometimes gives rise to very interesting samples.

Future work can include two directions – more applications or deeper analysis of the already trained models. Same models can be applied to your spotify listening history, for example. After training on your listening history data, you can give it a sequence of songs that you have listened to in the previous hour or so, and it will sample a playlist for you for the rest of the day. Well, you can also do the same for your browsing history, which will be just a cool tool to analyze your browsing behaviour patterns. Capture the accelerometer and gyroscope data from your phone while doing different activities (exercising in the gym, working in the office, sleeping) and learn to classify these activity stages. After that you can change your music playlist automatically, based on your activity (sleeping – calm music of rain, exercising in the gym – high intensity music). In terms of medical applications, model can be applied to detect heart problems based on pulse and other data, similar to this work.

It would be very interesting to analyze the neuron firings in our RNN trained for music generation like here. To see if the model learned some simple music concepts implicitly (like our discussion of harmony and melody). The hidden representation of RNN can be used to cluster our music dataset to find similar songs.

Let’s sample one last lyrics from our unconditional model to conclude this post 😀 :

The story ends  
The sound of the blue  
The tears were shining  
The story of my life  
I still believe  
The story of my life 

Loading

22 11월 2024

[교수법][PBL 수업] [태재미래교육포럼] 사라지는 것과 생겨나는 것 – AI를 이용한 학습자 중심의 PBL 사례 실습 (원종윤 동명대학교 시각디자인학과 교수)

[교수법][PBL 수업] [태재미래교육포럼] 사라지는 것과 생겨나는 것 – AI를 이용한 학습자 중심의 PBL 사례 실습 (원종윤 동명대학교 시각디자인학과 교수)

요약: “[태재미래교육포럼] 사라지는 것과 생겨나는 것 – AI를 이용한 학습자 중심의 PBL 사례 실습 (원종윤 동명대학교 시각디자인학과 교수)”

  1. AI를 활용한 교수법 개발
    • 2020년 코로나 시기 고립된 환경 속에서 메타버스와 AI 협업 도구를 활용한 교육법 개발.
    • AI 활용 사례: 이미지 생성, 메타버스 전공 연계, 게임 엔진 및 버추얼 휴먼 교육 등.
  2. AI와 창작 도구의 발전
    • 2022년 달리(DALL·E), 미드저니(MidJourney) 등의 이미지 생성 도구 조기 활용 경험.
    • 생성형 AI를 활용한 예술가 및 디자이너의 변화와 적응 사례.
  3. 교육 현장에서의 AI 활용
    • AI 도구를 활용한 PBL(프로젝트 기반 학습)의 투트랙 전략:
      • 초보자를 위한 프로젝트 제공.
      • 실제 문제 해결을 위한 고급 프로젝트 진행.
    • 중학교, 고등학교 교사 대상 AI 활용 교육 및 수업 계획 개발.
  4. AI의 창작 지원 및 한계
    • AI 도구를 활용한 예술 및 창작 지원 사례와 제한점:
      • 예: 어린이의 상상을 AI를 활용해 동화책 제작.
      • 저작권 문제와 표절 가능성에 대한 고찰.
  5. AI의 사회적 영향과 문제 해결
    • 생성형 AI로 인한 초상권, 저작권, 윤리적 문제들.
    • PBL 수업을 통한 문제 정의 및 해결 방안 도출.
    • AI 도구의 정확성과 신뢰성 확보를 위한 교육의 중요성.
  6. AI 기술과 직업의 변화
    • AI 활용 능력이 채용의 중요한 기준으로 부상.
    • AI 도입으로 인해 사라지는 직업과 새롭게 생겨나는 직업에 대한 전망.
  7. 저작권 및 윤리적 고려
    • AI 생성물의 저작권 부재와 인간 창작자의 기여도 기록 필요.
    • 교육 및 창작 환경에서 저작권 문제와 가이드라인 개발 사례.
  8. 학생과 교사 대상 AI 교육 사례
    • 다양한 연령과 수준에 맞춘 PBL 프로젝트 개발.
    • AI 도구를 활용한 수업 설계 및 팀 프로젝트 결과물 제작.
  9. 미래 AI 활용 방향성
    • AI 활용 경험을 통해 기술 발전의 가능성과 사회적 영향을 긍정적으로 수용.
    • 교육 및 창작 현장에서 AI의 도구적 역할과 문제 해결 능력 강조.
  10. 강의 결론 및 제언
    • AI 도구를 활용한 PBL은 미래 교육과 창작에 중요한 역할을 할 것.
    • 교사와 학생 모두 새로운 기술을 체험하고 문제를 해결하며 발전해야 함.

Loading