= … // 1ςΩετΛϕΫτϧԽʢmean pooling + L2ਖ਼نԽʣ func tensorize(text: String, asColumnVector: Bool = false) throws -> MLTensor? { let result = try embedding.embeddingResult(for: text, language: language) let dim = embedding.dimension var sum = [Float](repeating: 0, count: dim) var count = 0 result.enumerateTokenVectors(in: text.startIndex..<text.endIndex) { vecD, range in // Double -> Float ΛҰׅม var vecF = [Float](repeating: 0, count: dim) vDSP_vdpsp(vecD, 1, &vecF, 1, vDSP_Length(dim)) // sum += vecF vDSP_vadd(sum, 1, vecF, 1, &sum, 1, vDSP_Length(dim)) count += 1 return true } guard count > 0 else { return nil } // mean poolingʢsum /= countʣ var invN = 1.0 / Float(count) vDSP_vsmul(sum, 1, &invN, &sum, 1, vDSP_Length(dim)) // L2 ਖ਼نԽ let normVector = l2Normalize(sum) let shape = asColumnVector ? [normVector.count, 1] : [1, normVector.count] return MLTensor(shape: shape, scalars: normVector) } // L2 ਖ਼نԽ private func l2Normalize(_ vec: [Float]) -> [Float] { var norm: Float = 0 vDSP_svesq(vec, 1, &norm, vDSP_Length(vec.count)) norm = sqrtf(norm) + 1e-12 vDSP_vsdiv(vec, 1, &norm, &vec, 1, vDSP_Length(vec.count)) return vec } iOSʹΈࠐ·ΕͨBERTͰςΩετຒΊࠐΈɾϕΫτϧݕࡧΛΦϯσόΠε࣮ߦ͢Δ #Mac – Qiita هʢ2025/10/05ʣɿͪ͜Βͷهࣄ͕ΑΓࢀߟʹͳΔͱࢥΘΕ·͢ʂ https://qiita.com/5enxia/items/eea83cfd277584e00748