박용건


기획 배경

<aside> 💡 학과 발표회 프로젝트를 진행하며 배운 딥러닝과 관련하여 어떤 프로젝트를 만들면 좋을까 고민하다 이영상을 보고 걷기를 배우는 AI를 만들기로 결정했습니다.

</aside>

프로젝트 소개


신경망이란?

이번 프로젝트에서는 계층형 신경망을 사용하였습니다. 계층형 신경망을 사용한 이유는 선형 관계 뿐만 아니라 비선형 관계도 학습할 수 있으며, 복잡한 패턴을 학습시키기에 좋고, 무엇보다 여러 동영상에서 AI를 학습시키는데 계층형 신경망을 사용했기 때문입니다.

https://prod-files-secure.s3.us-west-2.amazonaws.com/8ca5d1e5-9dca-461d-bed2-8d48bfcdb87a/b2a382dc-43b0-4b4e-b904-687db8ee48b3/Untitled.png

사진에 비유해서 각계층을 설명하자면

입력계층은 고양이사진을 보여주면, 입력계층은 사진의 각각의 픽셀을 받아들이는 역할을 하는 계층입니다.

은닉계층은 받아들인 픽셀에서 분석하여 패턴을 찾아내는 활동을 통해 어떤 사진일지 알아내도록 도와주는 계층입니다.

출력계층은 이전 단계를 통해 알아낸 사진의 정보를 통합하여 이 사진이 고양이 사진인지 아닌지를 결정합니다.


신경망 코드

const NN = ({
    inputs,
    hiddenLayers,
    outputs,
    weights,
    activationFunction = sigmoid
}) => {
    if (!weights) {
        weights = [];

        layers = [inputs, ...hiddenLayers];
        layers.forEach((layer, idx) => {
            nextLayer = layers[idx + 1];
            if (nextLayer === undefined) {
                nextLayer = outputs;
            }
            weights.push(Array(nextLayer).fill(() => genRandVec(layer + 1)).map(x => x()))
        });
    }

    return {
        feedForward(inputs) {
            weights.forEach((weightList, idx) => {
                inputs = inputs.concat(1);
                const outputs = [];
                weightList.forEach((weights) => {
                    outputs.push(activationFunction(dotProduct(weights, inputs)))
                })
                inputs = outputs;
            })
            return inputs;
        },
        weights() {
            return weights;
        },
        reproduce(change) {
            return NN({
                weights: weights.map(weightList =>
                    weightList.map(weights =>
                        weights.map(weight =>
                            (weight === 1) ?
                            1 :
                            (Math.random() > (1 - change)) ? weight + randomGaussian() / (5 + (Manager.generation / 25)) : weight
                        )
                    )
                ),
            })
        },
        reproduceWith(nn) {
            const otherWeights = nn.weights();
            return NN({
                weights: weights.map((weightList, i1) => {
                    let randRow = Math.floor(Math.random() * weightList.length);
                    let randCol = Math.floor(Math.random() * weightList[0].length);
                    return weightList.map((weightRow, i2) => {
                        return weightRow.map((weight, i3) => (i1 < randRow || (i1 === randRow && i2 < randCol)) ? weight : otherWeights[i1][i2][i3])
                    })
                }),
            })
        }
    }
}

이 코드는 신경망을 생성하고 반환하는 역할을 하는 프로젝트에서 가장 중요한 함수입니다.